🤔 Got questions? Schedule an office hours session.
Tenderly SDK
Managing Contracts

Managing Contracts

The Tenderly SDK provides a ContractRepository class for managing contracts associated with your Tenderly project. The ContractRepository allows you to add, update, and remove contracts, as well as verify them.

With the Tenderly SDK initialized, you can use the contracts namespace to access the ContractRepository instance.

Adding a contract

To add a new contract, use the add method of the contracts namespace:

example.jsx
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);
}

Updating a contract

To update an existing contract, use the update method of the contracts namespace:

example.jsx
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);
}

Removing a contract

To remove a contract, use the remove method of the contracts namespace:

example.jsx
try {
  const contractAddress = '0x742d35Cc6634C0532925a3b844Bc454e4438f44e';
  await tenderly.contracts.remove(contractAddress);
  console.log('Contract removed successfully');
} catch (error) {
  console.error('Error removing contract:', error);
}

Verifying a contract

To verify a contract, you can use verify method of the contracts namespace.

There are three examples that show the usage of tenderly.contracts.verify method:

  • First example shows the verification of a simple Counter contract with no dependencies.
  • Second example shows the verification of a MyToken contract that has multiple dependencies which are other contracts.
  • Third example shows the verification of a LibraryToken contract that has a library dependency.

You can find these examples in the examples folder of our tenderly-sdk repo along with the instructions on how to start them. Here will be shown only a MyToken contract with a few dependencies so you can see how to import them:

example.js
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);