> ## 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.

# Управление контрактами

> Используйте эти примеры кода для добавления, обновления, удаления и верификации смарт-контрактов с помощью Tenderly SDK.

[Tenderly SDK](/platform/sdk/introduction) предоставляет класс `ContractRepository` для управления контрактами, связанными с вашим проектом Tenderly. `ContractRepository` позволяет добавлять, обновлять и удалять контракты, а также верифицировать их.

После инициализации Tenderly SDK вы можете использовать пространство имён **`contracts`** для доступа к экземпляру **`ContractRepository`**. Для управления кошельками в том же проекте см. [Управление кошельками](/platform/sdk/managing-wallets).

### Добавление контракта

Чтобы добавить новый контракт, используйте метод `add` пространства имён **`contracts`**:

```jsx title="example.jsx" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
try {
  const contractAddress = '0x742d35Cc6634C0532925a3b844Bc454e4438f44e';
  const contract = await tenderly.contracts.add(contractAddress, {
    displayName: 'MyContract',
  });

  console.log('Added contract:', addedContract);
} catch (error) {
  console.error('Error adding contract:', error);
}
```

### Обновление контракта

Чтобы обновить существующий контракт, используйте метод **`update`** пространства имён **`contracts`**:

```jsx title="example.jsx" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
try {
  const contractAddress = '0x742d35Cc6634C0532925a3b844Bc454e4438f44e';
  const contract = await tenderly.contracts.update(contractAddress, {
    displayName: 'My Contract',
  });
  console.log('Updated contract:', contract);
} catch (error) {
  console.error('Error updating contract:', error);
}
```

### Удаление контракта

Чтобы удалить контракт, используйте метод `remove` пространства имён **`contracts`**:

```jsx title="example.jsx" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
try {
  const contractAddress = '0x742d35Cc6634C0532925a3b844Bc454e4438f44e';
  await tenderly.contracts.remove(contractAddress);
  console.log('Contract removed successfully');
} catch (error) {
  console.error('Error removing contract:', error);
}
```

### Верификация контракта

Чтобы верифицировать контракт, вы можете использовать метод **`verify`** пространства имён **`contracts`**.

Есть три примера, демонстрирующих использование метода `tenderly.contracts.verify`:

* Первый пример показывает верификацию простого контракта `Counter` без зависимостей.
* Второй пример показывает верификацию контракта `MyToken`, у которого несколько зависимостей — других контрактов.
* Третий пример показывает верификацию контракта `LibraryToken` с зависимостью в виде библиотеки.

Эти примеры можно найти в [папке examples](https://github.com/Tenderly/tenderly-sdk/tree/master/examples/contractVerification) нашего репозитория `tenderly-sdk` вместе с инструкциями по их запуску. Здесь будет показан только контракт `MyToken` с несколькими зависимостями, чтобы вы увидели, как их импортировать:

```javascript title="example.js" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
const myTokenAddress = `0x1a273A64C89CC45aBa798B1bC31B416A199Be3b3`.toLowerCase() as Web3Address;
const ROOT_FOLDER = `examples/contractVerification/withDependencies/contracts`;

const tenderly = new Tenderly({
  accessKey: process.env.TENDERLY_ACCESS_KEY || ``,
  accountName: process.env.TENDERLY_ACCOUNT_NAME || ``,
  projectName: process.env.TENDERLY_PROJECT_NAME || ``,
  network: Network.SEPOLIA,
});

const result = await tenderly.contracts.verify(myTokenAddress, {
  config: {
    mode: `public`,
  },
  contractToVerify: `${ROOT_FOLDER}/MyToken.sol:MyToken`,
  solc: {
    version: `v0.8.19`,
    sources: {
      [`${ROOT_FOLDER}/MyToken.sol`]: {
        content: readFileSync(`${ROOT_FOLDER}/MyToken.sol`, `utf8`),
      },
      [`@openzeppelin/contracts/token/ERC20/ERC20.sol`]: {
        content: readFileSync(`${ROOT_FOLDER}/ERC20.sol`, `utf8`),
      },
      [`@openzeppelin/contracts/token/ERC20/IERC20.sol`]: {
        content: readFileSync(`${ROOT_FOLDER}/IERC20.sol`, `utf8`),
      },
      [`@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol`]: {
        content: readFileSync(`${ROOT_FOLDER}/IERC20Metadata.sol`, `utf8`),
      },
      [`@openzeppelin/contracts/utils/Context.sol`]: {
        content: readFileSync(`${ROOT_FOLDER}/Context.sol`, `utf8`),
      },
    },
    settings: {
      optimizer: {
        enabled: true,
        runs: 200,
      },
    },
  },
});

console.log(`Result:`, result);
```
