Files
proxmox/docs/08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md
defiQUG 2a6d3cfc7f
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
Update submodule references and improve CI workflow
- Update submodule references for explorer-monorepo and smom-dbis-138 to latest commits.
- Modify CI workflow to include shellcheck installation and enforce error severity for script checks.
- Update contract addresses in configuration and documentation to reflect the new canonical addresses for CCIPWETH9Bridge and CCIP Router.
- Revise integration test documentation to align with updated contract addresses and deployment statuses.

Made-with: Cursor
2026-03-24 22:50:52 -07:00

9.2 KiB

Blockscout Contract Verification Guide - ChainID 138

Last Updated: 2026-01-31
Document Version: 1.0
Status: Active Documentation


Purpose: Guide for verifying smart contracts on ChainID 138 using Blockscout
Block Explorer: https://explorer.d-bis.org


Overview

ChainID 138 uses Blockscout (self-hosted) as its block explorer. This guide covers how to verify smart contracts deployed on ChainID 138 using Foundry's verification tools.


Prerequisites

  1. Foundry installed and configured
  2. Deployed contracts on ChainID 138
  3. Access to contract source code and constructor arguments
  4. Blockscout instance accessible at https://explorer.d-bis.org

Blockscout Configuration

Block Explorer Information

  • URL: https://explorer.d-bis.org
  • API Endpoint: https://explorer.d-bis.org/api
  • Type: Self-hosted Blockscout
  • Chain ID: 138
  • API Key: Not required (self-hosted instance)

Verification Methods

Method 1: Using Foundry Script with Verification

When deploying contracts with Foundry, add Blockscout verification flags:

forge script script/YourDeploymentScript.s.sol:YourScript \
  --rpc-url https://rpc-core.d-bis.org \
  --private-key $PRIVATE_KEY \
  --broadcast \
  --verify \
  --verifier blockscout \
  --verifier-url https://explorer.d-bis.org/api \
  -vvvv

Method 2: Manual Verification with forge verify-contract

After deployment, verify contracts manually:

forge verify-contract \
  <CONTRACT_ADDRESS> \
  <CONTRACT_NAME> \
  --chain-id 138 \
  --rpc-url https://rpc-core.d-bis.org \
  --verifier blockscout \
  --verifier-url https://explorer.d-bis.org/api \
  --constructor-args $(cast abi-encode "constructor(<ARGS>)" <ARG1> <ARG2> ...) \
  --compiler-version <VERSION>

Method 3: Using Foundry.toml Configuration

Add Blockscout configuration to foundry.toml:

[etherscan]
chain138 = { 
  url = "https://explorer.d-bis.org/api",
  verifier = "blockscout"
}

Then use:

forge verify-contract \
  <CONTRACT_ADDRESS> \
  <CONTRACT_NAME> \
  --chain chain138 \
  --rpc-url https://rpc-core.d-bis.org

Verification Examples

Example 1: Simple Contract (No Constructor Arguments)

forge verify-contract \
  0x1234567890123456789012345678901234567890 \
  SimpleContract \
  --chain-id 138 \
  --rpc-url https://rpc-core.d-bis.org \
  --verifier blockscout \
  --verifier-url https://explorer.d-bis.org/api \
  --compiler-version 0.8.20

Example 2: Contract with Constructor Arguments

# First, encode constructor arguments
CONSTRUCTOR_ARGS=$(cast abi-encode "constructor(address,uint256)" \
  0x1111111111111111111111111111111111111111 \
  1000000000000000000)

# Then verify
forge verify-contract \
  0x1234567890123456789012345678901234567890 \
  ComplexContract \
  --chain-id 138 \
  --rpc-url https://rpc-core.d-bis.org \
  --verifier blockscout \
  --verifier-url https://explorer.d-bis.org/api \
  --constructor-args "$CONSTRUCTOR_ARGS" \
  --compiler-version 0.8.20

Example 3: Verify with Libraries

If your contract uses libraries, specify them:

forge verify-contract \
  <CONTRACT_ADDRESS> \
  <CONTRACT_NAME> \
  --chain-id 138 \
  --rpc-url https://rpc-core.d-bis.org \
  --verifier blockscout \
  --verifier-url https://explorer.d-bis.org/api \
  --libraries <LIBRARY_NAME>:<LIBRARY_ADDRESS> \
  --compiler-version <VERSION>

When proxy returns "Invalid JSON"

If you run ./scripts/verify/run-contract-verification-with-proxy.sh and get Invalid JSON, result=None, Blockscout may have returned a non-JSON response.

Note: Using --verifier-url https://explorer.d-bis.org/api directly with Forge (no proxy) fails with Params 'module' and 'action' are required — Blockscout's Etherscan-compatible API expects these as query parameters, which the forge-verification-proxy adds. So verification must use either (1) the proxy from a host that can reach Blockscout, or (2) manual UI below.

From a host where explorer.d-bis.org is reachable, you can try the proxy again, or verify manually. If you have a custom client that sends module=contract&action=verifysourcecode, you can verify directly:

cd smom-dbis-138
RPC="${RPC_URL_138:-https://rpc-core.d-bis.org}"
VERIFIER="https://explorer.d-bis.org/api"

# CCIPSender
forge verify-contract 0x105F8A15b819948a89153505762444Ee9f324684 \
  contracts/ccip/CCIPSender.sol:CCIPSender \
  --chain-id 138 --rpc-url "$RPC" --verifier blockscout --verifier-url "$VERIFIER" --flatten

# Oracle Proxy
forge verify-contract 0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6 \
  contracts/oracle/Proxy.sol:Proxy \
  --chain-id 138 --rpc-url "$RPC" --verifier blockscout --verifier-url "$VERIFIER" --flatten

# CCIPWETH9Bridge
forge verify-contract 0xcacfd227A040002e49e2e01626363071324f820a \
  contracts/ccip/CCIPWETH9Bridge.sol:CCIPWETH9Bridge \
  --chain-id 138 --rpc-url "$RPC" --verifier blockscout --verifier-url "$VERIFIER" --flatten

# CCIPWETH10Bridge
forge verify-contract 0xe0E93247376aa097dB308B92e6Ba36bA015535D0 \
  contracts/ccip/CCIPWETH10Bridge.sol:CCIPWETH10Bridge \
  --chain-id 138 --rpc-url "$RPC" --verifier blockscout --verifier-url "$VERIFIER" --flatten

Or run the batch script with the proxy pointing at the public explorer URL (from a host that can reach it): FORGE_VERIFIER_URL=https://explorer.d-bis.org/api ./scripts/verify-contracts-blockscout.sh (from repo root, after cd smom-dbis-138 as needed for paths). See also OPERATOR_OPTIONAL_CHECKLIST § Blockscout.


Troubleshooting

Issue: Verification Fails with "Contract Not Found"

Solution:

  • Ensure the contract is deployed and confirmed on ChainID 138
  • Verify the contract address is correct
  • Check that the RPC endpoint is accessible

Issue: "Invalid Source Code"

Solution:

  • Ensure compiler version matches the deployment compiler version
  • Verify all source files are accessible
  • Check that constructor arguments are correctly encoded

Issue: "Already Verified"

Solution:

  • The contract is already verified on Blockscout
  • Check the contract on the explorer: https://explorer.d-bis.org/address/<CONTRACT_ADDRESS>

Issue: Blockscout API Timeout

Solution:

  • Check if Blockscout instance is running and accessible
  • Verify network connectivity to https://explorer.d-bis.org
  • Try again after a few moments (Blockscout may be indexing)

Issue: Verification returns HTML or 502

Symptom: Proxy or Forge reports "Invalid JSON", "Blockscout returned HTML", or 502 Bad Gateway.

Causes: Blockscout (VMID 5000) may be down, DB not migrated, or thin pool full. The proxy converts non-JSON responses into a clear error message.

Solutions:

  1. From LAN: Ensure Blockscout is reachable: curl -s -o /dev/null -w "%{http_code}" http://192.168.11.140:4000/api?module=stats&action=eth_price (expect 200 or 404, not 502).
  2. Fix Blockscout: Follow BLOCKSCOUT_FIX_RUNBOOK.md (SSL/migrations, thin pool, start stack).
  3. Verify via UI: Use Verify & Publish in the explorer (see section below) when the site is up; no proxy needed.

Manual Verification via Blockscout UI

If automated verification fails, you can verify contracts manually through the Blockscout web interface:

  1. Navigate to the contract address: https://explorer.d-bis.org/address/<CONTRACT_ADDRESS>
  2. Click on "Verify & Publish" tab
  3. Select verification method:
    • Via Standard JSON Input (recommended)
    • Via Sourcify
    • Via Multi-file
  4. Upload contract source code and metadata
  5. Provide constructor arguments (if any)
  6. Submit for verification

Verification Best Practices

  1. Verify Immediately After Deployment: Verify contracts right after deployment while deployment details are fresh
  2. Use Standard JSON Input: Most reliable method for complex contracts
  3. Document Constructor Arguments: Keep a record of constructor arguments used during deployment
  4. Test Verification Locally: Test your verification command before deploying to production
  5. Keep Source Code Organized: Maintain clean source code structure for easier verification

  • Block Explorer: https://explorer.d-bis.org
  • RPC Endpoint: https://rpc-core.d-bis.org
  • API Keys Documentation: See docs/CROSS_CHAIN_BRIDGE_ADDRESSES.md
  • Contract Deployment Guide: See docs/CONTRACT_DEPLOYMENT_GUIDE.md

Quick Reference

Blockscout API Endpoints

  • API Base URL: https://explorer.d-bis.org/api
  • Contract Verification: POST /api/v2/smart-contracts/<ADDRESS>/verification
  • Contract Info: GET /api/v2/smart-contracts/<ADDRESS>

Common Verification Flags

--verifier blockscout                    # Use Blockscout verifier
--verifier-url https://explorer.d-bis.org/api  # Blockscout API URL
--chain-id 138                           # Chain ID 138
--compiler-version 0.8.20                # Solidity compiler version
--constructor-args <ENCODED_ARGS>        # Encoded constructor arguments
--libraries <LIB>:<ADDR>                 # Library addresses

Last Updated: 2026-02-23
Status: Ready for use with ChainID 138