import { ethers } from "hardhat";
import deployments from "../deployments.json";
async function main() {
const network = "sepolia";
const deployment = deployments.deployments[network];
if (!deployment) {
throw new Error(`No deployment found for network: ${network}`);
}
const [signer] = await ethers.getSigners();
console.log("๐ Connected wallet:", signer.address);
console.log("");
// Get addresses from environment
const daoAddress = process.env.ARAGON_DAO_ADDRESS;
const pluginAddress = process.env.CAP_GOVERNANCE_PLUGIN_ADDRESS;
const capTokenAddress = deployment.proxyAddress;
if (!daoAddress || !pluginAddress) {
throw new Error("ARAGON_DAO_ADDRESS or CAP_GOVERNANCE_PLUGIN_ADDRESS not set in .env");
}
console.log("๐ Configuration:");
console.log("โโ CAP Token:", capTokenAddress);
console.log("โโ Aragon DAO:", daoAddress);
console.log("โโ Governance Plugin:", pluginAddress);
console.log("");
// Get CAP token contract
const cap = await ethers.getContractAt("CAPToken", capTokenAddress);
// =============================================================================
// STEP 1: Check and Transfer Ownership
// =============================================================================
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
console.log("STEP 1: Transfer Token Ownership to DAO");
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
const currentOwner = await cap.owner();
console.log("Current owner:", currentOwner);
console.log("Target DAO:", daoAddress);
if (currentOwner.toLowerCase() === daoAddress.toLowerCase()) {
console.log("โ
DAO already owns the token!");
} else if (currentOwner.toLowerCase() === signer.address.toLowerCase()) {
console.log("");
console.log("๐ Transferring ownership to DAO...");
const tx = await cap.transferOwnership(daoAddress);
console.log("๐ค Transaction sent:", tx.hash);
await tx.wait();
console.log("โ
Ownership transferred successfully!");
// Verify
const newOwner = await cap.owner();
console.log("โ
Verified new owner:", newOwner);
console.log("");
console.log("โ ๏ธ IMPORTANT: All admin functions now require DAO governance!");
} else {
console.log("โ ERROR: You are not the current owner!");
console.log(` Current owner: ${currentOwner}`);
console.log(` Your address: ${signer.address}`);
console.log("");
console.log("โญ๏ธ Skipping ownership transfer...");
}
console.log("");
// =============================================================================
// STEP 2: Delegate Voting Power
// =============================================================================
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
console.log("STEP 2: Activate Voting Power");
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
// Check current delegation
const currentDelegate = await cap.delegates(signer.address);
console.log("Current delegate:", currentDelegate);
if (currentDelegate.toLowerCase() === signer.address.toLowerCase()) {
console.log("โ
Voting power already activated (self-delegated)!");
} else {
console.log("");
console.log("๐ณ๏ธ Self-delegating to activate voting power...");
const tx = await cap.delegate(signer.address);
console.log("๐ค Transaction sent:", tx.hash);
await tx.wait();
console.log("โ
Voting power activated!");
}
// Check voting power
const balance = await cap.balanceOf(signer.address);
const votes = await cap.getVotes(signer.address);
console.log("");
console.log("๐ Your Voting Power:");
console.log("โโ Balance:", ethers.formatEther(balance), "CAP");
console.log("โโ Votes:", ethers.formatEther(votes), "CAP");
console.log("");
// =============================================================================
// STEP 3: Display Current Token State
// =============================================================================
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
console.log("STEP 3: Current Token State");
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
const totalSupply = await cap.totalSupply();
const owner = await cap.owner();
const feeRecipient = await cap.feeRecipient();
const transferTax = await cap.transferTaxBp();
const sellTax = await cap.sellTaxBp();
const buyTax = await cap.buyTaxBp();
console.log("Token Information:");
console.log("โโ Name:", await cap.name());
console.log("โโ Symbol:", await cap.symbol());
console.log("โโ Total Supply:", ethers.formatEther(totalSupply), "CAP");
console.log("โโ Decimals:", await cap.decimals());
console.log("");
console.log("Governance:");
console.log("โโ Owner (DAO):", owner);
console.log("");
console.log("Tax Configuration:");
console.log("โโ Transfer Tax:", transferTax, "bp (", Number(transferTax) / 100, "%)");
console.log("โโ Sell Tax:", sellTax, "bp (", Number(sellTax) / 100, "%)");
console.log("โโ Buy Tax:", buyTax, "bp (", Number(buyTax) / 100, "%)");
console.log("");
console.log("Fee Recipient:");
console.log("โโ", feeRecipient);
// Check for pending tax changes
const pendingTimestamp = await cap.taxChangeTimestamp();
if (pendingTimestamp > 0) {
const pendingTransfer = await cap.pendingTransferTaxBp();
const pendingSell = await cap.pendingSellTaxBp();
const pendingBuy = await cap.pendingBuyTaxBp();
console.log("");
console.log("โณ Pending Tax Change:");
console.log("โโ Transfer Tax:", pendingTransfer, "bp");
console.log("โโ Sell Tax:", pendingSell, "bp");
console.log("โโ Buy Tax:", pendingBuy, "bp");
console.log("โโ Ready at:", new Date(Number(pendingTimestamp) * 1000).toLocaleString());
}
console.log("");
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
console.log("โ
DAO Governance Setup Complete!");
console.log("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
console.log("");
console.log("๐ฏ Next Steps:");
console.log("1. Visit your DAO:");
console.log(` https://app.aragon.org/#/daos/sepolia/${daoAddress}`);
console.log("");
console.log("2. Create your first proposal to test governance");
console.log("");
console.log("3. Other token holders should also delegate their voting power:");
console.log(" npx hardhat run scripts/delegate-voting-power.ts --network sepolia");
console.log("");
console.log("๐ Documentation:");
console.log(" - Governance Guide: docs/GOVERNANCE.md");
console.log(" - Aragon Integration: docs/aragon-integration.md");
console.log("");
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error("\nโ Error:", error.message);
process.exit(1);
});