मुख्य सामग्री पर जाएं
Foundry या Hardhat का उपयोग करके Virtual Environment पर Solidity contracts deploy करें। Virtual Environment पर deploy किए गए contracts को virtual contracts कहा जाता है और वे Virtual Contracts tab के तहत Contracts section में दिखाई देते हैं। deploy करते समय contracts को verify करें। Verified contracts explorer में Debugger, Gas Profiler, Simulator, और समृद्ध transaction views को अनलॉक करते हैं।

शुरू करने से पहले

Virtual Environment पर Verification को अलग access key की आवश्यकता नहीं है: RPC URL स्वयं authenticate करता है, और verifier endpoint उसी URL के साथ /verify जोड़ा हुआ है।
डिफ़ॉल्ट रूप से, Virtual Environment पर verify किए गए contracts निजी होते हैं। public explorer की visibility setting के आधार पर, code बाहरी रूप से दिखाई दे सकता है। कुछ भी verify करने से पहले public explorer toggle और verification visibility जाँच लें जिसे आप निजी रखना चाहते हैं।

Deploy और verify

foundry.toml कॉन्फ़िगर करें

Tenderly का verifier उस metadata hash को match करता है जिसे Solidity compiler deployed bytecode में जोड़ता है, आपके द्वारा submit किए गए source के विरुद्ध। compiled output में metadata को रखने के लिए cbor_metadata और bytecode_hash को स्पष्ट रूप से सेट करें:
foundry.toml
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc_version = "0.8.24"
optimizer = true
optimizer_runs = 200

# Required for Tenderly contract verification:
# keep the CBOR metadata so the verifier can match the on-chain bytecode hash.
cbor_metadata = true
bytecode_hash = "ipfs"
cbor_metadata = true और bytecode_hash = "ipfs" Foundry के डिफ़ॉल्ट हैं, लेकिन कुछ templates उन्हें strip कर देते हैं; bytecode_hash = "none" verification को तोड़ देता है। solc_version और optimizer settings को pin करें ताकि re-verification वही bytecode compile करे।यदि आपका project OpenZeppelin जैसी libraries का उपयोग करता है, तो remappings.txt में remappings को स्पष्ट रूप से घोषित करें:
remappings.txt
@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/
forge-std/=lib/forge-std/src/
Auto-detected remappings के साथ, verification payload में build द्वारा उपयोग की गई अलग remapping strings हो सकती हैं, जिससे bytecode-mismatch failures होते हैं।

Environment variables सेट करें

showLineNumbers
export TENDERLY_VIRTUAL_TESTNET_RPC=...   # paste your RPC URL
export TENDERLY_VERIFIER_URL=$TENDERLY_VIRTUAL_TESTNET_RPC/verify
export PRIVATE_KEY=...                    # deployer private key
Deploy करने से पहले connection की जाँच करें। cast chain-id को Virtual Environment के chain ID को print करना चाहिए, और deployer balance गैर-शून्य होना चाहिए:
cast chain-id --rpc-url $TENDERLY_VIRTUAL_TESTNET_RPC
cast balance <DEPLOYER_ADDRESS> --rpc-url $TENDERLY_VIRTUAL_TESTNET_RPC

forge create के साथ deploy करें

verify flags के साथ forge create चलाएं। Constructor arguments raw values के रूप में पास किए जाते हैं; Foundry उन्हें ABI-encode करता है और encoded रूप को verifier को submit करता है:
showLineNumbers
forge create src/Counter.sol:Counter \
  --rpc-url $TENDERLY_VIRTUAL_TESTNET_RPC \
  --private-key $PRIVATE_KEY \
  --broadcast \
  --verify \
  --verifier custom \
  --verifier-url $TENDERLY_VERIFIER_URL \
  --constructor-args 42
--constructor-args को अंत में रखें। यह command line के बाकी हिस्से को greedily consume कर लेता है, इसलिए इसके बाद रखा गया कोई भी flag एक और constructor argument माना जाता है।

Foundry script के साथ deploy करें

एक ही run में कई contracts deploy करने के लिए forge script का उपयोग करें। script में प्रत्येक new Foo(...) को verification के लिए स्वचालित रूप से submit किया जाता है, broadcast log से लिए गए सही constructor arguments के साथ। Imports को transparently handle किया जाता है: verifier को एक standard-JSON payload मिलता है जिसमें compiler द्वारा छूने वाली प्रत्येक source file होती है, इसलिए local imports और library imports (जैसे OpenZeppelin) बिना अतिरिक्त steps के verify होते हैं।--slow का उपयोग करें ताकि transactions एक-एक करके भेजी जाएं। इसके बिना, broadcast batching पिछले transaction के confirm होने से पहले एक transaction submit कर सकती है, जो एक hosted RPC के विरुद्ध flaky है और verification step को race कर सकती है।
showLineNumbers
forge script script/Counter.s.sol:CounterScript \
  --rpc-url $TENDERLY_VIRTUAL_TESTNET_RPC \
  --private-key $PRIVATE_KEY \
  --broadcast \
  --slow \
  --verify \
  --verifier custom \
  --verifier-url $TENDERLY_VERIFIER_URL

मौजूदा contract को verify करें

पहले से deployed contracts को forge verify-contract के साथ verify किया जा सकता है। forge create के विपरीत, यह command पहले से ही ABI-encoded constructor arguments की अपेक्षा करता है; उन्हें बनाने के लिए cast abi-encode का उपयोग करें:
showLineNumbers
forge verify-contract $COUNTER_ADDRESS src/Counter.sol:Counter \
  --verifier custom \
  --verifier-url $TENDERLY_VERIFIER_URL \
  --constructor-args $(cast abi-encode "constructor(uint256)" 42) \
  --watch
--watch verifier को तब तक poll करता है जब तक verification समाप्त न हो जाए और परिणाम print करता है। Multi-contract deployments के लिए, प्रत्येक deployed address के लिए forge verify-contract एक बार चलाएं।

Dashboard जाँचें

Tenderly Dashboard में, Contracts खोलें और Virtual Contracts tab चुनें। आपके नए deployed contracts वहाँ दिखाई देते हैं, प्रत्येक contract के लिए verification status दिखाई देता है।

Troubleshooting

लक्षणसंभावित कारणसमाधान
verifier से unauthorized / -32004 responseगलत verifier URL। एक सामान्य गलती /verify के बजाय /verify/etherscan जोड़ना है।सुनिश्चित करें कि verifier URL ठीक /verify पर समाप्त होता है।
Bytecode does not match deployed contractsubmit किया गया source deploy किए गए source से अलग compile हुआ: एक optimizer_runs mismatch, एक अलग solc_version, या एक stripped metadata hash।foundry.toml में solc_version, optimizer, optimizer_runs, और bytecode_hash को pin करें। फिर से verify करने से पहले forge clean && forge build चलाएं।
Failed to deserialize contentverifier ने एक error string लौटाई जिसे Foundry parse नहीं कर सकता, आमतौर पर एक upstream auth या path error को wrap कर रहा है।URL की फिर से जाँच करें और raw response देखने के लिए -vvvv के साथ फिर से चलाएं।
forge create पर Dry run enabled, not broadcasting transaction--broadcast पास नहीं किया गया, या --constructor-args द्वारा निगल लिया गया।--constructor-args को अंतिम flag बनने के लिए स्थानांतरित करें।
forge script पर केवल पहला contract verify होता हैRPC race: पहले receipt से पहले दूसरा transaction submit हुआ।--slow जोड़ें।
Verifier OK की रिपोर्ट करता है लेकिन explorer अभी भी unverified दिखाता हैUI caching।explorer page को hard-refresh करें। API response में status authoritative है।

अगले कदम