इन पर काम करता है: Virtual Environments और सार्वजनिक नेटवर्क (mainnets और testnets)। समान plugin दोनों को संभालता है;
hardhat.config.ts में इसे सही नेटवर्क पर इंगित करें।@tenderly/hardhat-tenderly का उपयोग करके proxy contract सत्यापन के बारे में बताएगा।
आवश्यकताएँ
स्वचालित proxy सत्यापन@tenderly/hardhat-tenderly पर बिना किसी अतिरिक्त सेटअप के काम करता है:
>= 1.10.0(Ethers 5 line)>= 2.1.0(Ethers 6 line)
@openzeppelin/hardhat-upgrades के साथ proxies को deploy करते हैं। Hardhat Ignition अभी proxy सत्यापन के लिए समर्थित नहीं है।
यदि आप plugin के निचले संस्करण पर हैं और upgrade नहीं कर सकते, तो नीचे दिए गए manual workaround का उपयोग करें।
स्वचालित सत्यापन
यह plugin तीन proxy patterns को सत्यापित करता है:TransparentUpgradeableProxy, UUPSUpgradeableProxy, और BeaconProxy।
अंदर से, plugin
@openzeppelin/hardhat-upgrades extension के साथ @nomicfoundation/hardhat-verify को drive करता है। TENDERLY_AUTOMATIC_POPULATE_HARDHAT_VERIFY_CONFIG=true सेट करने से plugin आपके लिए @nomicfoundation/hardhat-verify का verification URL populate कर देता है।अधिक स्पष्ट दृश्य के लिए, आप इस GitHub repo को देख सकते हैं और पूरा उदाहरण देखने के लिए
scripts/proxy/ पर जा सकते हैं। Automatic
@openzeppelin/hardhat-upgrades extension से deployProxy का उपयोग करके proxy को हमेशा की तरह deploy करें।अंदर से, स्वचालित सत्यापन deployProxy को wrap करके, और deployment के पूरा होने की प्रतीक्षा करके implement किया जाता है। Manual
manual verification method के साथ proxy का सत्यापन तब किया जाता है जब proxy contract deploy हो चुका होता है,
tenderly.verify() function को कॉल करके।निचले संस्करणों के लिए Workaround
@tenderly/hardhat-tenderly के संस्करण < 1.10.0 और < 2.1.0 का उपयोग करते समय, यह workaround स्वचालित सत्यापन को सक्षम करेगा।
आपको निम्नलिखित को सत्यापित करने की आवश्यकता है:
- Proxy contract (जैसे OpenZeppelin’s proxies)
- Proxy के पीछे Implementation
- Implementation की किसी भी dependencies
- Upgrades के साथ deploy किए गए नए implementation instances
अवलोकन
इस गाइड में, हम OpenZeppelin के UUPSUpgradeable, TransparentUpgradeableProxy, और BeaconProxy विकल्पों के सत्यापन को प्रदर्शित करने के लिए एक उदाहरण Hardhat project और@tenderly/hardhat-tenderly plugin का उपयोग करेंगे।
Deploy किए गए implementation का address प्राप्त करने के लिए, @openzeppelin/upgrades-core package और getImplementationAddress function का उपयोग करें।
Proxy implementation को सत्यापित करना आमतौर पर सीधा है; इसे किसी भी अन्य contract की तरह सत्यापित करें।
example.ts
- उपयोग किए जा रहे proxy के type के आधार पर proxy के सटीक smart contract को load करें, ताकि इसे compile किया जा सके। आपको एक dummy .sol फ़ाइल बनाकर compiler के माध्यम से proxy contracts को import करना होगा।
- उन settings को निर्दिष्ट करने के लिए
hardhat.config.tsको Modify करें जिनके साथ OpenZeppelin contracts compile किए गए थे।
example.ts
Non-Homebrew install विकल्पों के लिए Tenderly CLI repo देखें।
hardhat.config.ts में, tenderly.username और tenderly.project को अपने project और username slugs पर सेट करें।Contracts को deploy और सत्यापित करने का सबसे तेज़ तरीका Virtual Environment पर है।
Tenderly Dashboard में, Virtual Environments खोलें और एक नया बनाएँ। fork करने के लिए base network और एक Chain ID चुनें, फिर Virtual Environment के विवरण पृष्ठ से Admin RPC URL copy करें।
networks: {
virtualMainnet: {
url: process.env.TENDERLY_VIRTUAL_TESTNET_RPC!,
chainId: 73571, // the Chain ID you set when creating the Virtual Environment
},
},
पूर्ण walkthrough के लिए Virtual Environment quickstart देखें।
Contracts को redeploy करते समय, पहले
.openzeppelin folder को हटा दें। यह proxies और उनके implementations के बारे में जानकारी cache करता है।Proxy contract को सत्यापित करने के लिए, एक
DummyProxy.sol फ़ाइल बनाएँ और उन OpenZeppelin proxy contracts को import करें जिनके साथ आप काम कर रहे हैं। ऐसा करने से, ये contracts load हो जाते हैं और compiler से गुज़र जाते हैं, जिससे आप सत्यापन के दौरान proxy के सटीक contract source को reference कर सकते हैं।// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
abstract contract ERC1967ProxyAccess is ERC1967Proxy {}
abstract contract UpgradableBeaconAccess is UpgradeableBeacon {}
abstract contract BeaconProxyAccess is BeaconProxy {}
abstract contract TransparentUpgradeableProxyAccess is TransparentUpgradeableProxy {}
निम्नलिखित overrides map
@openzeppelin/contracts-upgradeable संस्करण 4.9.1 के लिए निकाला गया था।
यह package के अन्य संस्करणों के लिए भिन्न हो सकता है।OpenZeppelin के proxy contracts को compile करने के बाद, आपको निम्नलिखित को भी निर्दिष्ट करना होगा:
hardhat-tenderly plugin सत्यापन के लिए smart contracts के सोर्स कोड और compiler settings दोनों का उपयोग करता है।
यदि इनमें से कोई भी setting गलत है, तो सत्यापन विफल हो जाएगा।const config: HardhatUserConfig = {
solidity: {
compilers: [{ version: '0.8.18' } /* OTHER COMPILER VERSIONS*/],
overrides: {
'@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol': {
version: '0.8.9',
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
},
'@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol': {
version: '0.8.9',
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
},
'@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol': {
version: '0.8.9',
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
},
'@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol': {
version: '0.8.9',
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
},
'contracts/proxy.sol': {
version: '0.8.9',
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
},
},
},
/* OTHER CONFIG */
};
Proxy type के अनुसार सत्यापित करें
ये code samples दिखाते हैं कि OpenZeppelin के तीन proxy patterns के लिए implementation और proxy को कैसे सत्यापित किया जाए। ये उदाहरण एक proxiedVault contract का उपयोग करते हैं जो एक ERC-20 token (TToken) को reference करता है।
UUPS proxy
UUPS proxy और underlying जानकारी को सत्यापित करने के लिए,hardhat-tenderly plugin को दो बार कॉल करें:
- Implementation को सत्यापित करने के लिए, आपको निम्नलिखित प्रदान करने की आवश्यकता है:
- अपने proxied contract का
name(हमारे मामले मेंVault) - वह address जहाँ contract deploy किया गया था,
@openzeppelin/upgrades-coreसेgetImplementationAddressmethod का उपयोग करके।
- Proxy को सत्यापित करने के लिए, निम्नलिखित प्रदान करें:
- proxy contract
nameके रूप मेंERC1967Proxy - Proxy का address
proxy.address
example.ts
पूर्ण Code नमूना
यहाँ एक पूर्ण Hardhat test है जो निम्न कार्य करता है:TTokenको Deploy करता है (vault के लिए आवश्यक)Vaultको एक proxy के रूप में Deploy करता है,TTokencontract के साथ initialize करता हैawait proxy.getAddress()पर deploy किए गए proxy (ERC1967Proxy) instance को सत्यापित करता हैgetImplementationAddress(ethers.provider, await proxy.getAddress())पर deploy किए गए implementation instanceVaultको सत्यापित करता है- Proxy को
VaultV2पर Upgrade करता है
example.ts
Transparent proxy
UUPS proxy और underlying जानकारी को सत्यापित करने के लिए, दो contracts पास करते हुएhardhat-tenderly को कॉल करें: implementation के लिए Vault, और proxy के लिए स्वयं TransparentUpgradeableProxy।
example.ts
- Implementation को सत्यापित करने के लिए, निम्नलिखित प्रदान करें:
- अपने proxied contract का
name(हमारे मामले मेंVault) - वह address जहाँ contract deploy किया गया था,
@openzeppelin/upgrades-coreसेgetImplementationAddressmethod का उपयोग करके।
- Proxy को सत्यापित करने के लिए, निम्नलिखित प्रदान करें:
- proxy contract
nameके रूप मेंTransparentUpgradeableProxy - Proxy का address
await proxy.getAddress()
पूर्ण Code नमूना
example.ts
Beacon proxy
Beacon proxy और underlying जानकारी को सत्यापित करने के लिए, आपको दो contracts सत्यापित करने होंगे:Vault (implementation) और OpenZeppelin का UpgradableBeacon:
example.ts
पूर्ण Code नमूना
example.ts