/**
* Delegate CAP tokens to activate voting power
*
* For ERC20Votes tokens like CAP, voting power must be explicitly delegated.
* This script delegates your tokens to yourself, activating your voting power.
*
* Usage:
* npm run dao:delegate
* or: npx hardhat run --network sepolia scripts/dao/delegate-tokens.ts
*/
import { ethers } from "hardhat";
import * as dotenv from "dotenv";
dotenv.config();
async function main() {
console.log("\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
console.log("โ Delegate CAP Tokens for Voting โ");
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n");
const [signer] = await ethers.getSigners();
const network = await ethers.provider.getNetwork();
console.log("๐ Configuration:");
console.log(" Network:", network.name);
console.log(" Address:", signer.address);
console.log(" CAP Token:", process.env.CAP_TOKEN_ADDRESS);
console.log("");
if (!process.env.CAP_TOKEN_ADDRESS) {
throw new Error("โ CAP_TOKEN_ADDRESS not set in .env");
}
const capTokenAddress = process.env.CAP_TOKEN_ADDRESS;
// Get CAP token contract
console.log("๐ Loading CAP token contract...");
const CAPToken = await ethers.getContractFactory("CAPToken");
const capToken = CAPToken.attach(capTokenAddress);
// Check current state
console.log("๐ Checking current delegation...");
const balance = await capToken.balanceOf(signer.address);
const currentDelegate = await capToken.delegates(signer.address);
const currentVotes = await capToken.getVotes(signer.address);
console.log(" Balance:", ethers.formatEther(balance), "CAP");
console.log(" Current Delegate:", currentDelegate);
console.log(" Current Voting Power:", ethers.formatEther(currentVotes), "votes");
console.log("");
if (currentDelegate.toLowerCase() === signer.address.toLowerCase()) {
console.log("โ
Already delegated to yourself!");
console.log(" Voting power:", ethers.formatEther(currentVotes), "votes\n");
return;
}
// Delegate to self
console.log("๐ณ๏ธ Delegating tokens to yourself...");
console.log(" This will activate your voting power\n");
try {
const tx = await capToken.delegate(signer.address);
console.log("๐ Transaction submitted:", tx.hash);
console.log("โณ Waiting for confirmation...\n");
const receipt = await tx.wait();
console.log("โ
Transaction confirmed!");
console.log(" Block:", receipt.blockNumber);
console.log(" Gas Used:", receipt.gasUsed.toString());
console.log("");
// Verify delegation
console.log("๐ Verifying delegation...");
const newDelegate = await capToken.delegates(signer.address);
const newVotes = await capToken.getVotes(signer.address);
console.log(" New Delegate:", newDelegate);
console.log(" New Voting Power:", ethers.formatEther(newVotes), "votes");
console.log("");
if (newDelegate.toLowerCase() === signer.address.toLowerCase()) {
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
console.log("โ ๐ DELEGATION SUCCESSFUL! โ");
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n");
console.log("โ
Your voting power is now active!");
console.log(" You can now vote on DAO proposals\n");
console.log("๐ Your Voting Stats:");
console.log(" Balance:", ethers.formatEther(balance), "CAP");
console.log(" Voting Power:", ethers.formatEther(newVotes), "votes");
console.log(" Min to Create Proposal: 10,000 CAP");
console.log("");
if (Number(ethers.formatEther(newVotes)) >= 10000) {
console.log("โ
You have enough power to create proposals!\n");
} else {
console.log("โ ๏ธ You need 10,000 CAP to create proposals");
console.log(" Current: " + ethers.formatEther(newVotes) + " CAP\n");
}
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
console.log("โ ๐ NEXT STEPS โ");
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n");
console.log("1. โ
Tokens Delegated!");
console.log(" You can now participate in governance\n");
console.log("2. ๐งช Test DAO Functionality:");
console.log(" npm run dao:test\n");
console.log("3. ๐ Create Your First Proposal:");
console.log(" Visit: https://app.aragon.org/#/daos/sepolia/" + process.env.ARAGON_DAO_ADDRESS);
console.log("");
} else {
throw new Error("Delegation verification failed");
}
} catch (error) {
console.error("\nโ Error delegating tokens:");
console.error(" Message:", error instanceof Error ? error.message : String(error));
if (error && typeof error === "object" && "reason" in error) {
console.error(" Reason:", error.reason);
}
console.error("\n๐ก Troubleshooting:");
console.error(" - Ensure you have CAP tokens");
console.error(" - Verify you have Sepolia ETH for gas");
console.error(" - Check CAP_TOKEN_ADDRESS is correct\n");
throw error;
}
}
// Execute
main()
.then(() => {
console.log("โ
Script completed successfully\n");
process.exit(0);
})
.catch((error) => {
console.error("\nโ Script failed:", error.message);
process.exit(1);
});