Deploy your smart contract

After testing your contract carefully. You might want to deploy it to the U2U network. This section will guide you to deploy your smart contract.
In Hardhat, scripts are JavaScript/Typescript files that you can use to automate various tasks related to your U2U network development and smart contract deployment. These scripts are typically used to perform actions such as deploying smart contracts, interacting with contracts, testing, and more. Hardhat provides a powerful scripting environment that allows you to work with U2U network and your smart contracts programmatically.

Deployment script

Now, let's create a script for deployment as follow:
scripts/
deploy.ts
A script should have this structure:
import { ethers } from "hardhat";
async function main() {
// your code here
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
Put some variables, inside function main() (remember to import ethers library):
import { ethers } from "hardhat";
async function main() {
const currentTimestampInSeconds = Math.round(Date.now() / 1000);
const unlockTime = currentTimestampInSeconds + 60;
const lockedAmount = ethers.parseEther("0.001");
}
Then add deployment code:
const lock = await ethers.deployContract("Lock", [unlockTime], {
value: lockedAmount,
});
await lock.waitForDeployment();
We use ethers.deployContract() to deploy the contract with given unlock time and the amount we want to lock. It returns a promise of deployed Lock instance.
Then wait for the deployment is finished with lock.waitForDeployment()
Below is full deploy.ts script:
import { ethers } from "hardhat";
async function main() {
const currentTimestampInSeconds = Math.round(Date.now() / 1000);
const unlockTime = currentTimestampInSeconds + 60;
const lockedAmount = ethers.parseEther("0.001");
const lock = await ethers.deployContract("Lock", [unlockTime], {
value: lockedAmount,
});
await lock.waitForDeployment();
console.log(
`Lock with ${ethers.formatEther(
lockedAmount
)}U2U and unlock timestamp ${unlockTime} deployed to ${lock.target}`
);
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});

Network configuration

Hardhat needs a node to connect and deploy the contract on U2U network. You need to provide network configuration to Hardhat, that is hardhat.config.js or hardhat.config.ts located in the project directory.
Let's say we want to deploy your contract on U2U Nebulas testnet, our configuration file should look like this:
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
const config: HardhatUserConfig = {
solidity: "0.8.19",
networks: {
nebulas: {
url: 'https://rpc-nebulas-testnet.uniultra.xyz/',
accounts: ["YOUR_PRIVATE_KEY"], // it should start with 0x...
}
},
etherscan: {
apiKey: {
nebulas: "abc", // arbitrary string
},
customChains: [
{
network: "nebulas",
chainId: 2484,
urls: {
apiURL: "https://testnet.u2uscan.xyz/api",
browserURL: "https://testnet.u2uscan.xyz"
}
},
]
}
};
export default config;

Run deployment script

To run deployment script:
npx hardhat run scripts/deploy.ts --network <network-name>
In this case, <network-name> should be nebulas:
npx hardhat run scripts/deploy.ts --network nebulas
It will produced:
Lock with 0.001U2U and unlock timestamp 1696615281 deployed to 0x8D51395C76C34d0e11178c1F7EE3219B4b958e30
If you face with this error:
ProviderError: insufficient balance for transfer
Your account have not enough token U2U. Please head to faucet to fund your account.
Voila! Your contract is deployed on Nebulas testnet!