ChainForge Academy

Master ERC-20 token deployment using PHP Laravel. From smart contract fundamentals to mainnet launches — hands-on backend instruction for de...
San Juan, PH
Created byProfile pictureburlytab
3 joined
Profile picture
@burlytabProfile pictureJun 8

How to Call an Ethereum Smart Contract from PHP Laravel (Step-by-Step)

Most Laravel developers assume you need Node.js or Python to interact with Ethereum. You don't.


Here's a complete walkthrough for calling a read-only function on any deployed ERC-20 smart contract — directly from your Laravel app.


---


Prerequisites


  • PHP 8.1+ with Laravel 10+

  • Composer

  • A free Infura account (infura.io) for an Ethereum RPC endpoint


Step 1: Install Web3.php


composer require web3p/web3 web3p/ethereum-tx


This gives you a PHP-native Ethereum client — no JavaScript bridge needed.


Step 2: Create an Ethereum Service


// app/Services/EthereumService.php

namespace App\Services;

use Web3\Web3;
use Web3\Contract;

class EthereumService
{
    protected Web3 $web3;

    public function __construct()
    {
        $this->web3 = new Web3(config('services.ethereum.rpc_url'));
    }

    public function getTokenName(string $contractAddress): string
    {
        // Minimal ABI — only the name() function
        $abi = '[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"type":"function"}]';

        $contract = new Contract($this->web3->provider, $abi);
        $result = null;

        $contract->at($contractAddress)->call('name', function ($err, $data) use (&$result) {
            if ($err) {
                throw new \RuntimeException("Contract call failed: " . $err->getMessage());
            }
            $result = $data[0];
        });

        return $result;
    }
}


Step 3: Configure Your RPC Endpoint


Add this to your .env:


ETHEREUM_RPC_URL=https://mainnet.infura.io/v3/YOUR_PROJECT_ID


And in config/services.php:


'ethereum' => [
    'rpc_url' => env('ETHEREUM_RPC_URL'),
],


Step 4: Call It from a Controller


use App\Services\EthereumService;

Route::get('/token/{address}/name', function (string $address, EthereumService $eth) {
    return response()->json([
        'contract' => $address,
        'name'     => $eth->getTokenName($address),
    ]);
});


Hit /token/0xdAC17F958D2ee523a2206206994597C13D831ec7/name and you'll get:


{
    "contract": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
    "name": "Tether USD"
}


That's USDT's contract on mainnet.


---


What's Next


This is just reading data. Writing to the blockchain (deploying tokens, executing transfers) requires transaction signing, gas estimation, and nonce management — all doable in pure PHP.


I teach the complete pipeline inside ChainForge Academy: from this exact starting point all the way to deploying your own ERC-20 token to mainnet from a Laravel backend.


If you want the full build, check out the course.