Deployment

This guide covers deploying smart contracts to Tensora L2 using Hardhat and Foundry.

Prerequisites

  • Node.js 18+ (for Hardhat)

  • Foundry (for forge)

  • TORA for gas (via Paymaster or direct BNB)

  • Private key with funds

Hardhat Deployment

Setup

Copy

mkdir my-tensora-project
cd my-tensora-project
npm init -y
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox ethers dotenv

Configuration

hardhat.config.ts:

Copy

import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import * as dotenv from "dotenv";

dotenv.config();

const config: HardhatUserConfig = {
  solidity: {
    version: "0.8.20",
    settings: {
      optimizer: {
        enabled: true,
        runs: 200
      }
    }
  },
  networks: {
    tensora: {
      url: process.env.TENSORA_RPC || "https://rpc.tensora.org",
      chainId: 20250,
      accounts: [process.env.PRIVATE_KEY!],
      gasPrice: 1000000000, // 1 gwei
    },
    bsc: {
      url: process.env.BSC_RPC || "https://bsc-dataseed.binance.org",
      chainId: 56,
      accounts: [process.env.PRIVATE_KEY!]
    }
  },
  etherscan: {
    apiKey: {
      tensora: process.env.TENSORA_API_KEY || "placeholder",
      bsc: process.env.BSC_API_KEY || ""
    },
    customChains: [
      {
        network: "tensora",
        chainId: 20250,
        urls: {
          apiURL: "https://explorer.tensora.org/api",
          browserURL: "https://explorer.tensora.org"
        }
      }
    ]
  }
};

export default config;

.env:

Copy

TENSORA_RPC=https://rpc.tensora.org
BSC_RPC=https://bsc-dataseed.binance.org
PRIVATE_KEY=0xabc123...
TENSORA_API_KEY=your_key_here
BSC_API_KEY=your_key_here

Deploy Script

scripts/deploy.ts:

Copy

import { ethers } from "hardhat";

async function main() {
  const [deployer] = await ethers.getSigners();
  
  console.log("Deploying contracts with:", deployer.address);
  console.log("Balance:", ethers.formatEther(await ethers.provider.getBalance(deployer.address)));

  // Deploy MyContract
  const MyContract = await ethers.getContractFactory("MyContract");
  const myContract = await MyContract.deploy(arg1, arg2);
  
  await myContract.waitForDeployment();
  const address = await myContract.getAddress();
  
  console.log("MyContract deployed to:", address);
  
  // Verify on explorer (optional)
  console.log("Waiting for block confirmations...");
  await myContract.deploymentTransaction()?.wait(5);
  
  console.log("Verifying contract...");
  await run("verify:verify", {
    address: address,
    constructorArguments: [arg1, arg2]
  });
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

Run the deploy script:

Copy

npx hardhat run scripts/deploy.ts --network tensora

Foundry Deployment

Setup

Copy

forge init my-tensora-project
cd my-tensora-project

Configuration

foundry.toml:

Copy

[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc_version = "0.8.20"
optimizer = true
optimizer_runs = 200

[rpc_endpoints]
tensora = "${TENSORA_RPC}"
bsc = "${BSC_RPC}"

[etherscan]
tensora = { key = "${TENSORA_API_KEY}", url = "https://explorer.tensora.org/api" }
bsc = { key = "${BSC_API_KEY}" }

Deploy Script

script/Deploy.s.sol:

Copy

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "../src/MyContract.sol";

contract DeployScript is Script {
    function run() external {
        uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
        vm.startBroadcast(deployerPrivateKey);

        MyContract myContract = new MyContract(arg1, arg2);
        
        console.log("MyContract deployed to:", address(myContract));

        vm.stopBroadcast();
    }
}

Run the Foundry script:

Copy

forge script script/Deploy.s.sol:DeployScript \
  --rpc-url tensora \
  --broadcast \
  --verify

Verify Contract Manually

Copy

forge verify-contract \
  --chain-id 20250 \
  --num-of-optimizations 200 \
  --constructor-args $(cast abi-encode "constructor(uint256,address)" 42 0x...) \
  --etherscan-api-key $TENSORA_API_KEY \
  --verifier-url https://explorer.tensora.org/api \
  $CONTRACT_ADDRESS \
  src/MyContract.sol:MyContract

Last updated