Tenderly Environment Deployment for EIL¶
This guide walks you through deploying a Tenderly environment for EIL (Ethereum Interoperability Layer), including setting up Virtual TestNets, a flexible development infrastructure, and running the Docker-based development environment in Tenderly mode.
Prerequisites¶
- Tenderly account
- Docker installed and running
- Node.js and Yarn package manager
- Chain Abstraction SDK: Download v1.0.0
Step 1: Create a Tenderly account and set up Virtual TestNets¶
1.1 Create a Tenderly account¶
- Visit Tenderly Dashboard and create an account
- Create a new project for your EIL environment
- Navigate to the Virtual TestNets section
1.2 Create Virtual TestNets for four chains¶
Create four separate Virtual TestNets for each required blockchain:
- Ethereum Mainnet (Chain ID: 1)
- Optimism (Chain ID: 10)
- Arbitrum One (Chain ID: 42161)
- Base Mainnet (Chain ID: 8453)
For each Virtual TestNet:
- Enable State sync to keep your network replicas in real-time sync with the parent networks
1.3 Collect RPC URLs¶
After creating each Virtual TestNet, collect the Admin RPC URLs:
- Copy the Admin RPC URL for each network (you'll need these for environment configuration)
- The URLs will look like:
https://virtual.testnet.tenderly.co/[tenant]/[project]/[id]
Step 2: Install the Chain Abstraction SDK¶
Add the Chain Abstraction SDK and required dependencies:
# Install the SDK package from the hosted tarball
yarn add <https://ca-proj.netlify.app/chain-abstraction-v1.0.0-20251112.110201.tar.gz>
# Install required dependencies
yarn add viem permissionless tsx
yarn add -D typescript @types/node esbuild
Step 3: Configure the environment for Tenderly Mode¶
3.1 Set environment variables¶
Copy the sample environment file from the SDK:
cp node_modules/chain-abstraction/dockers.env.sample .env
Edit the .env file and configure:
# Required: Your Alchemy API key for upstream connections
ALCHEMY_API_KEY=your_alchemy_key_here
# Set Docker mode to use Tenderly
NODES_MODE=tenderly
# Configure Tenderly URLs for each chain
TENDERLY_ETH=https://virtual.testnet.tenderly.co/[tenant]/[project]/[ethereum-id]
TENDERLY_ARB=https://virtual.testnet.tenderly.co/[tenant]/[project]/[arbitrum-id]
TENDERLY_BASE=https://virtual.testnet.tenderly.co/[tenant]/[project]/[base-id]
TENDERLY_OP=https://virtual.testnet.tenderly.co/[tenant]/[project]/[optimism-id]
# Output folder for deployment configuration
DEPLOYMENT=${PWD}/deployment
# Network access configuration
HOSTNAME=localhost
# Optional: Enable debug logging
DEBUG=false
3.2 Understanding Tenderly Mode¶
When NODES_MODE=tenderly is set:
- Local proxy nodes are created that connect to your Tenderly Virtual TestNets
- Proxy nodes support transaction tracing (required for bundlers)
- Local endpoints expose standard ports:
8500-8503for the four chains - Applications can use either Tenderly URLs directly or local proxy URLs
Step 3: Launch the Docker environment¶
3.3 Verify the Docker setup¶
Ensure Docker is running and the environment is properly configured:
# Check if Docker is running
docker version
# Verify environment configuration (should show no errors)
yarn dockers-config
3.4 Start all services¶
Launch the complete EIL environment:
# Start all services and wait for complete initialization
yarn dockers-run
This command will:
- Start proxy nodes connecting to your Tenderly Virtual TestNets
- Deploy all necessary smart contracts
- Start bundlers for each chain
- Initialize mock liquidity providers
- Wait for all components to be ready
3.5 Monitoring the environment¶
Alternative: Use yarn dockers-up to run with attached logs in the foreground:
# Start with logs attached (use Ctrl+C to stop)
yarn dockers-up
The setup is complete when you see the "wait-for-all" service exit successfully.
3.6 Access local proxy endpoints¶
Your Tenderly networks are now accessible via local proxy nodes:
- Ethereum:
http://localhost:8500 - Arbitrum:
http://localhost:8501 - Base:
http://localhost:8502 - Optimism:
http://localhost:8503
Bundler endpoints are also available:
- Ethereum Bundler:
http://localhost:3000/rpc - Arbitrum Bundler:
http://localhost:3001/rpc - Base Bundler:
http://localhost:3002/rpc - Optimism Bundler:
http://localhost:3003/rpc
Step 4: Testing and validation¶
5.1 Verify network connectivity¶
Test connectivity to all chains:
# Check all nodes are responding
for port in 8500 8501 8502 8503; do
echo "Testing port $port..."
curl -X POST <http://localhost>:$port \\
-H "Content-Type: application/json" \\
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
done
5.2 Monitor transaction activity¶
Use the Tenderly Dashboard to monitor:
- Transaction execution across all chains
- Gas usage optimization
- Cross-chain message passing
- Smart contract interactions
Configuration Reference¶
Required environment variables¶
| Variable | Description | Example |
|---|---|---|
NODES_MODE |
Set to tenderly for Tenderly mode |
tenderly |
TENDERLY_ETH |
Ethereum Virtual TestNet RPC URL | https://virtual.testnet.tenderly.co/... |
TENDERLY_ARB |
Arbitrum Virtual TestNet RPC URL | https://virtual.testnet.tenderly.co/... |
TENDERLY_BASE |
Base Virtual TestNet RPC URL | https://virtual.testnet.tenderly.co/... |
TENDERLY_OP |
Optimism Virtual TestNet RPC URL | https://virtual.testnet.tenderly.co/... |
ALCHEMY_API_KEY |
Alchemy API key for upstream data | ak_... |
Network Port Mapping¶
| Network | Proxy Port | Bundler Port | Chain ID |
|---|---|---|---|
| Ethereum | 8500 | 3000 | 73571 |
| Arbitrum | 8501 | 3001 | 73573 |
| Base | 8502 | 3002 | 73574 |
| Optimism | 8503 | 3003 | 73572 |