- 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
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
- Foundry installed and configured
- Deployed contracts on ChainID 138
- Access to contract source code and constructor arguments
- 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:
- 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). - Fix Blockscout: Follow BLOCKSCOUT_FIX_RUNBOOK.md (SSL/migrations, thin pool, start stack).
- 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:
- Navigate to the contract address:
https://explorer.d-bis.org/address/<CONTRACT_ADDRESS> - Click on "Verify & Publish" tab
- Select verification method:
- Via Standard JSON Input (recommended)
- Via Sourcify
- Via Multi-file
- Upload contract source code and metadata
- Provide constructor arguments (if any)
- Submit for verification
Verification Best Practices
- Verify Immediately After Deployment: Verify contracts right after deployment while deployment details are fresh
- Use Standard JSON Input: Most reliable method for complex contracts
- Document Constructor Arguments: Keep a record of constructor arguments used during deployment
- Test Verification Locally: Test your verification command before deploying to production
- Keep Source Code Organized: Maintain clean source code structure for easier verification
Related Documentation
- 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