> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Proxy Contracts का सत्यापन

> Tenderly-Hardhat plugin का उपयोग करके proxy smart contracts के सत्यापन के बारे में जानने के लिए इस चरण-दर-चरण गाइड का पालन करें।

<Info>
  **इन पर काम करता है:** Virtual Environments और सार्वजनिक नेटवर्क (mainnets और testnets)। समान plugin दोनों को संभालता है; `hardhat.config.ts` में इसे सही नेटवर्क पर इंगित करें।
</Info>

यह गाइड आपको `@tenderly/hardhat-tenderly` का उपयोग करके proxy contract सत्यापन के बारे में बताएगा।

## आवश्यकताएँ

स्वचालित proxy सत्यापन `@tenderly/hardhat-tenderly` पर बिना किसी अतिरिक्त सेटअप के काम करता है:

* **`>= 1.10.0`** (Ethers 5 line)
* **`>= 2.1.0`** (Ethers 6 line)

```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
npm update @tenderly/hardhat-tenderly
```

यह केवल तभी काम करता है जब आप [`@openzeppelin/hardhat-upgrades`](https://docs.openzeppelin.com/upgrades-plugins/api-hardhat-upgrades) के साथ proxies को deploy करते हैं। [Hardhat Ignition](https://hardhat.org/ignition/docs/getting-started#overview) अभी proxy सत्यापन के लिए **समर्थित नहीं है**।

यदि आप plugin के निचले संस्करण पर हैं और upgrade नहीं कर सकते, तो नीचे दिए गए [manual workaround](#workaround-for-lower-versions) का उपयोग करें।

## स्वचालित सत्यापन

यह plugin तीन proxy patterns को सत्यापित करता है: `TransparentUpgradeableProxy`, `UUPSUpgradeableProxy`, और `BeaconProxy`।

<Steps>
  ### auto-populate flag सेट करें

  अंदर से, plugin `@openzeppelin/hardhat-upgrades` extension के साथ `@nomicfoundation/hardhat-verify` को drive करता है। `TENDERLY_AUTOMATIC_POPULATE_HARDHAT_VERIFY_CONFIG=true` सेट करने से plugin आपके लिए `@nomicfoundation/hardhat-verify` का verification URL populate कर देता है।

  ```bash title=".env" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  TENDERLY_AUTOMATIC_POPULATE_HARDHAT_VERIFY_CONFIG=true
  ```

  ### deployment script लिखें

  अधिक स्पष्ट दृश्य के लिए, आप [इस GitHub repo](https://github.com/Tenderly/hardhat-tenderly/tree/master/examples/contract-verification/ethers-v6) को देख सकते हैं और पूरा उदाहरण देखने के लिए **`scripts/proxy/`** पर जा सकते हैं।

  <Tabs>
    <Tab title="Automatic">
      **`@openzeppelin/hardhat-upgrades`** extension से `deployProxy` का उपयोग करके proxy को हमेशा की तरह deploy करें।

      <Warning>
        आगे इसके साथ interact करने के लिए आपको **`waitForDeployment`** function द्वारा लौटाए गए object को capture करना चाहिए।
      </Warning>

      अंदर से, स्वचालित सत्यापन **`deployProxy`** को wrap करके, और deployment के पूरा होने की प्रतीक्षा करके implement किया जाता है।

      ```typescript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

      async function main() {
          console.log(
              "🖖🏽[ethers] Deploying TransparentUpgradeableProxy with VotingLogic as implementation on Tenderly.",
          );

          const VotingLogic = await ethers.getContractFactory("VotingLogic");
          let proxyContract = await upgrades.deployProxy(VotingLogic);
          proxyContract = await proxyContract.waitForDeployment();

          const proxyAddress = await proxyContract.getAddress();

          console.log("VotingLogic proxy deployed to:", proxyAddress);
          console.log(
              "VotingLogic impl deployed to:",
              await getImplementationAddress(ethers.provider, proxyAddress),
          );
      }

      main().catch((error) => {
          console.error(error);
          process.exitCode = 1;
      });
      ```
    </Tab>

    <Tab title="Manual">
      manual verification method के साथ proxy का सत्यापन तब किया जाता है जब proxy contract deploy हो चुका होता है, **`tenderly.verify()`** function को कॉल करके।

      ```typescript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

      async function main() {
          console.log(
              "🖖🏽[ethers] Deploying TransparentUpgradeableProxy with VotingLogic as implementation on Tenderly.",
          );

          const VotingLogic = await ethers.getContractFactory("VotingLogic");
          let proxyContract = await upgrades.deployProxy(VotingLogic);
          proxyContract = await proxyContract.waitForDeployment();

          const proxyAddress = await proxyContract.getAddress();

          console.log("VotingLogic proxy deployed to:", proxyAddress);
          console.log(
              "VotingLogic impl deployed to:",
              await getImplementationAddress(ethers.provider, proxyAddress),
          );

          await tenderly.verify({
              name: ProxyPlaceholderName,
              address: proxyAddress,
          });
      }

      main().catch((error) => {
          console.error(error);
          process.exitCode = 1;
      });
      ```
    </Tab>
  </Tabs>

  ### script चलाएँ

  <Tabs>
    <Tab title="Virtual Environment">
      ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
      TENDERLY_AUTOMATIC_VERIFICATION=true \
      TENDERLY_AUTOMATIC_POPULATE_HARDHAT_VERIFY_CONFIG=true \
      npx hardhat run scripts/deploy.ts
      ```
    </Tab>

    <Tab title="Public network">
      किसी सार्वजनिक mainnet या testnet पर deploy करते समय, यह निर्दिष्ट करें कि आप सार्वजनिक या निजी सत्यापन चाहते हैं।

      ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
      TENDERLY_AUTOMATIC_VERIFICATION=true \
      TENDERLY_AUTOMATIC_POPULATE_HARDHAT_VERIFY_CONFIG=true \
      TENDERLY_PRIVATE_VERIFICATION=true \
      npx hardhat run scripts/deploy.ts --network mainnet_base
      ```
    </Tab>
  </Tabs>
</Steps>

## निचले संस्करणों के लिए Workaround

`@tenderly/hardhat-tenderly` के संस्करण **`< 1.10.0`** और **`< 2.1.0`** का उपयोग करते समय, यह workaround स्वचालित सत्यापन को सक्षम करेगा।

आपको निम्नलिखित को सत्यापित करने की आवश्यकता है:

* Proxy contract (जैसे OpenZeppelin's proxies)
* Proxy के पीछे Implementation
* Implementation की किसी भी dependencies
* Upgrades के साथ deploy किए गए नए implementation instances

सत्यापन प्रक्रिया proxy contract type और implementation के आधार पर भिन्न होती है।

<figure>
  <img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/Verifying%20Proxy%20Contracts%20Doc%20Chart.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=e9f97aa47100831216c10cc3ed7e7c58" alt="Tenderly Docs" width="2200" height="1219" data-path="images/Verifying Proxy Contracts Doc Chart.webp" />

  <figcaption />
</figure>

### अवलोकन

इस गाइड में, हम OpenZeppelin के [UUPSUpgradeable](https://docs.openzeppelin.com/contracts/4.x/api/proxy#UUPSUpgradeable), [TransparentUpgradeableProxy](https://docs.openzeppelin.com/contracts/4.x/api/proxy#TransparentUpgradeableProxy), और [BeaconProxy](https://docs.openzeppelin.com/contracts/4.x/api/proxy#BeaconProxy) विकल्पों के सत्यापन को प्रदर्शित करने के लिए [एक उदाहरण Hardhat project](https://github.com/Tenderly/tenderly-examples) और **`@tenderly/hardhat-tenderly`** plugin का उपयोग करेंगे।

<Warning>
  Proxy contracts को [manually सत्यापित](/contract-verification/hardhat#manual-verification) करने की आवश्यकता है। स्वचालित सत्यापन को इस प्रकार बंद करें:

  ```typescript title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  // use manual verification
  tenderly.setup({ automaticVerifications: false });
  ```
</Warning>

Deploy किए गए implementation का address प्राप्त करने के लिए, **`@openzeppelin/upgrades-core`** package और **`getImplementationAddress`** function का उपयोग करें।

Proxy implementation को सत्यापित करना आमतौर पर सीधा है; इसे किसी भी अन्य contract की तरह सत्यापित करें।

```typescript title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
await tenderly.verify({
  // the new implementation contract
  name: 'VaultV2',
  // the address where implementation is deployed
  address: await getImplementationAddress(ethers.provider, await proxy.getAddress()),
});
```

Proxy instance को सत्यापित करने के लिए, आपको ये दो प्रारंभिक चरण पूरे करने होंगे:

1. उपयोग किए जा रहे proxy के type के आधार पर [proxy के सटीक smart contract को load करें](#loading-proxy-contracts), ताकि इसे compile किया जा सके। आपको एक dummy .sol फ़ाइल बनाकर compiler के माध्यम से proxy contracts को import करना होगा।
2. उन settings को निर्दिष्ट करने के लिए [**`hardhat.config.ts`** को Modify](#configuring-solidity-compiler-overrides) करें जिनके साथ OpenZeppelin contracts compile किए गए थे।

एक बार ये चरण पूरे हो जाने के बाद, आप proxy को किसी भी अन्य contract की तरह सत्यापित करने के लिए आगे बढ़ सकते हैं।

```ts title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
await tenderly.verify({
  name: 'ERC1967Proxy', // or TransparentUpgradeableProxy or BeaconProxy
  address: await proxy.getAddress(),
});
```

<Steps>
  ### example repo को Clone करें

  ```sh theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  git clone git@github.com:Tenderly/tenderly-examples.git
  cd contract-verifications
  npm i
  ```

  ### Tenderly CLI सेट अप करें

  ```sh theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  brew tap tenderly/tenderly && brew install tenderly
  tenderly login
  ```

  Non-Homebrew install विकल्पों के लिए [Tenderly CLI repo](https://github.com/Tenderly/tenderly-cli) देखें।

  ### Hardhat को configure करें

  `hardhat.config.ts` में, `tenderly.username` और `tenderly.project` को अपने [project और username slugs](/platform/account/projects/slug) पर सेट करें।

  ### एक Virtual Environment बनाएँ

  Contracts को deploy और सत्यापित करने का सबसे तेज़ तरीका [Virtual Environment](/virtual-environments/overview) पर है।

  [Tenderly Dashboard](https://dashboard.tenderly.co) में, **Virtual Environments** खोलें और एक नया बनाएँ। fork करने के लिए base network और एक Chain ID चुनें, फिर Virtual Environment के विवरण पृष्ठ से **Admin RPC URL** copy करें।

  अपनी `.env` फ़ाइल में RPC URL जोड़ें:

  ```bash title=".env" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  TENDERLY_VIRTUAL_TESTNET_RPC=https://virtual.<network>.rpc.tenderly.co/<your-uuid>
  ```

  फिर इसे `hardhat.config.ts` में reference करें:

  ```typescript title="hardhat.config.ts" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  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](/virtual-environments/quickstart) देखें।

  ### tests चलाएँ

  ```sh theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  rm -rf .openzeppelin && npx hardhat test --network virtualMainnet
  ```

  <Note>Contracts को redeploy करते समय, पहले **`.openzeppelin`** folder को हटा दें। यह proxies और उनके implementations के बारे में जानकारी cache करता है।</Note>

  ### proxy contracts को load करें

  Proxy contract को सत्यापित करने के लिए, एक **`DummyProxy.sol`** फ़ाइल बनाएँ और उन OpenZeppelin proxy contracts को import करें जिनके साथ आप काम कर रहे हैं। ऐसा करने से, ये contracts load हो जाते हैं और compiler से गुज़र जाते हैं, जिससे आप सत्यापन के दौरान proxy के सटीक contract source को reference कर सकते हैं।

  ```sol theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  // 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 {}
  ```

  ### Solidity compiler overrides को configure करें

  <Note>
    निम्नलिखित overrides map **`@openzeppelin/contracts-upgradeable`** संस्करण **`4.9.1`** के लिए निकाला गया था।
    यह package के अन्य संस्करणों के लिए भिन्न हो सकता है।
  </Note>

  OpenZeppelin के proxy contracts को compile करने के बाद, आपको निम्नलिखित को भी निर्दिष्ट करना होगा:

  * Solidity compiler का संस्करण जो contracts को compile करने के लिए उपयोग किया गया था
  * Openzeppelin के upgrades plugin द्वारा proxy deployment/upgrades करते समय उपयोग की गई Optimization settings

  <Warning>
    **`hardhat-tenderly`** plugin सत्यापन के लिए smart contracts के सोर्स कोड और compiler settings दोनों का उपयोग करता है।
    यदि इनमें से कोई भी setting गलत है, तो सत्यापन विफल हो जाएगा।
  </Warning>

  अपने Hardhat User config object के **`config.solidity`** अनुभाग में निम्नलिखित **`overrides`** map जोड़ें।

  ```ts title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  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 */
  };
  ```
</Steps>

## Proxy type के अनुसार सत्यापित करें

ये code samples दिखाते हैं कि OpenZeppelin के तीन proxy patterns के लिए implementation और proxy को कैसे सत्यापित किया जाए। ये उदाहरण एक proxied `Vault` contract का उपयोग करते हैं जो एक ERC-20 token (`TToken`) को reference करता है।

### UUPS proxy

UUPS proxy और underlying जानकारी को सत्यापित करने के लिए, **`hardhat-tenderly`** plugin को दो बार कॉल करें:

1. Implementation को सत्यापित करने के लिए, आपको निम्नलिखित प्रदान करने की आवश्यकता है:

* अपने proxied contract का **`name`** (हमारे मामले में **`Vault`**)
* वह address जहाँ contract deploy किया गया था, **`@openzeppelin/upgrades-core`** से **`getImplementationAddress`** method का उपयोग करके।

2. Proxy को सत्यापित करने के लिए, निम्नलिखित प्रदान करें:

* proxy contract **`name`** के रूप में **`ERC1967Proxy`**
* Proxy का address **`proxy.address`**

```ts title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
await tenderly.verify(
  {
    name: 'Vault',
    address: await getImplementationAddress(ethers.provider, await proxy.getAddress()),
  },
  {
    name: 'ERC1967Proxy',
    address: await proxy.getAddress(),
  },
);
```

#### पूर्ण Code नमूना

यहाँ एक पूर्ण Hardhat test है जो निम्न कार्य करता है:

* **`TToken`** को Deploy करता है (vault के लिए आवश्यक)
* **`Vault`** को एक proxy के रूप में Deploy करता है, **`TToken`** contract के साथ initialize करता है
* **`await proxy.getAddress()`** पर deploy किए गए proxy (**`ERC1967Proxy`**) instance को सत्यापित करता है
* **`getImplementationAddress(ethers.provider, await proxy.getAddress())`** पर deploy किए गए implementation instance **`Vault`** को सत्यापित करता है
* Proxy को **`VaultV2`** पर Upgrade करता है

```ts title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

describe('Vault', () => {
  it('uups proxy deployment and verification', async () => {
    const VaultFactory = await ethers.getContractFactory('Vault');
    const TokenFactory = await ethers.getContractFactory('TToken');

    let token = await ethers.deployContract('TToken');
    token = await token.waitForDeployment();
    const tokenAddress = await token.getAddress();

    await tenderly.verify({
      name: 'TToken',
      address: tokenAddress,
    });

    let proxy = await upgrades.deployProxy(VaultFactory, [tokenAddress], {
      kind: 'uups',
    });
    await proxy.waitForDeployment();
    const proxyAddress = await proxy.getAddress();

    console.log('Deployed UUPS ', {
      proxy: proxyAddress,
      implementation: await getImplementationAddress(ethers.provider, proxyAddress),
    });

    await tenderly.verify(
      {
        name: 'Vault',
        address: await getImplementationAddress(ethers.provider, proxyAddress),
      },
      {
        name: 'ERC1967Proxy',
        address: proxyAddress,
      },
    );

    // upgrade
    const vaultV2Factory = await ethers.getContractFactory('VaultV2');
    proxy = (await upgrades.upgradeProxy(proxy, vaultV2Factory, {
      kind: 'uups',
    })) as Vault;

    await proxy.waitForDeployment();

    console.log('Upgraded UUPS ', {
      proxy: proxyAddress,
      implementation: await getImplementationAddress(ethers.provider, proxyAddress),
    });

    await tenderly.verify({
      name: 'VaultV2',
      address: await getImplementationAddress(ethers.provider, proxyAddress),
    });
  });
});
```

### Transparent proxy

UUPS proxy और underlying जानकारी को सत्यापित करने के लिए, दो contracts पास करते हुए **`hardhat-tenderly`** को कॉल करें: implementation के लिए **`Vault`**, और proxy के लिए स्वयं **`TransparentUpgradeableProxy`**।

```ts title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
await tenderly.verify(
  {
    name: 'Vault',
    address: await getImplementationAddress(ethers.provider, await proxy.getAddress()),
  },
  {
    name: 'TransparentUpgradeableProxy',
    address: await proxy.getAddress(),
  },
);
```

1. Implementation को सत्यापित करने के लिए, निम्नलिखित प्रदान करें:

* अपने proxied contract का **`name`** (हमारे मामले में **`Vault`**)
* वह address जहाँ contract deploy किया गया था, **`@openzeppelin/upgrades-core`** से **`getImplementationAddress`** method का उपयोग करके।

2. Proxy को सत्यापित करने के लिए, निम्नलिखित प्रदान करें:

* proxy contract **`name`** के रूप में **`TransparentUpgradeableProxy`**
* Proxy का address **`await proxy.getAddress()`**

#### पूर्ण Code नमूना

```ts title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

describe('Vault', () => {
  it('transparent upgradable proxy deployment and verification', async () => {
    const VaultFactory = await ethers.getContractFactory('Vault');
    const TokenFactory = await ethers.getContractFactory('TToken');

    let token = await ethers.deployContract('TToken');
    token = await token.waitForDeployment();
    const tokenAddress = await token.getAddress();

    await tenderly.verify({
      name: 'TToken',
      address: tokenAddress,
    });

    let proxy = await upgrades.deployProxy(VaultFactory, [tokenAddress], {
      kind: 'transparent',
    });
    await proxy.waitForDeployment();
    const proxyAddress = await proxy.getAddress();

    console.log('Deployed transparent', {
      proxy: proxyAddress,
      implementation: await getImplementationAddress(ethers.provider, proxyAddress),
    });

    await tenderly.verify(
      {
        name: 'Vault',
        address: await getImplementationAddress(ethers.provider, proxyAddress),
      },
      {
        name: 'TransparentUpgradeableProxy',
        address: proxyAddress,
      },
    );

    // upgrade
    const vaultV2Factory = await ethers.getContractFactory('VaultV2');

    proxy = (await upgrades.upgradeProxy(proxy, vaultV2Factory, {
      kind: 'transparent',
    })) as Vault;

    await proxy.waitForDeployment();

    console.log('Upgraded transparent ', {
      proxy: proxyAddress,
      implementation: await getImplementationAddress(ethers.provider, proxyAddress),
    });

    await tenderly.verify({
      name: 'VaultV2',
      address: await getImplementationAddress(ethers.provider, proxyAddress),
    });
  });
});
```

### Beacon proxy

Beacon proxy और underlying जानकारी को सत्यापित करने के लिए, आपको दो contracts सत्यापित करने होंगे: **`Vault`** (implementation) और OpenZeppelin का **`UpgradableBeacon`**:

```ts title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
await tenderly.verify(
  {
    name: 'Vault',
    address: await getImplementationAddressFromBeacon(ethers.provider, await beacon.getAddress()),
  },
  {
    name: 'UpgradeableBeacon',
    address: await beacon.getAddress(),
  },
);
```

#### पूर्ण Code नमूना

```ts title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

describe('Vault', () => {
  it('beacon proxy deployment and verification', async () => {
    const VaultFactory = await ethers.getContractFactory('Vault');
    const TokenFactory = await ethers.getContractFactory('TToken');

    let token = await ethers.deployContract('TToken');
    token = await token.waitForDeployment();
    const tokenAddress = await token.getAddress();

    await tenderly.verify({
      name: 'TToken',
      address: tokenAddress,
    });

    let beacon = (await upgrades.deployBeacon(VaultFactory)) as UpgradeableBeacon;

    await beacon.waitForDeployment();
    const beaconAddress = await beacon.getAddress();

    let vault = await upgrades.deployBeaconProxy(beacon, VaultFactory, [tokenAddress], {
      initializer: 'initialize',
    });
    await vault.waitForDeployment();

    console.log('Deployed beacon ', {
      proxy: beaconAddress,
      implementation: await getImplementationAddressFromBeacon(ethers.provider, beaconAddress),
      beacon: beaconAddress,
    });

    await tenderly.verify(
      {
        name: 'Vault',
        address: await getImplementationAddressFromBeacon(ethers.provider, beaconAddress),
      },
      {
        name: 'UpgradeableBeacon',
        address: beaconAddress,
      },
    );

    const vaultV2Factory = await ethers.getContractFactory('VaultV2');

    // upgrade
    vault = await upgrades.deployBeaconProxy(beacon, vaultV2Factory, [tokenAddress]);

    await upgrades.upgradeBeacon(beaconAddress, vaultV2Factory, {});

    console.log('Upgraded beacon ', {
      proxy: beaconAddress,
      implementation: await getImplementationAddressFromBeacon(ethers.provider, beaconAddress),
      beacon: beaconAddress,
    });

    await tenderly.verify({
      name: 'VaultV2',
      address: await getImplementationAddressFromBeacon(ethers.provider, beaconAddress),
    });
  });
});
```
