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 dotenvConfiguration
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_hereDeploy 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 tensoraFoundry Deployment
Setup
Copy
forge init my-tensora-project
cd my-tensora-projectConfiguration
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 \
--verifyVerify 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:MyContractLast updated