// scripts/deploy_all.ts
import { ethers } from 'hardhat';
async function main() {
const [deployer] = await ethers.getSigners();
console.log('Deploying VinuSwap with account:', deployer.address);
console.log('Account balance:', ethers.utils.formatEther(
await deployer.getBalance()
));
// Configuration
const config = {
WVC: '0x...', // Existing WVC (Wrapped VC) on VinuChain
DISCOUNT_TOKEN: '0x...',
FEE_ACCOUNTS: ['0x...', '0x...'],
FEE_SHARES: [1, 1],
NATIVE_LABEL: 'VC'
};
const deployed: Record<string, string> = {};
// 1. Fee Managers
console.log('\n--- Deploying Fee Managers ---');
const TieredDiscount = await ethers.getContractFactory('TieredDiscount');
const tieredDiscount = await TieredDiscount.deploy(
config.DISCOUNT_TOKEN,
[
ethers.utils.parseEther('1000'),
ethers.utils.parseEther('10000'),
ethers.utils.parseEther('100000'),
ethers.utils.parseEther('1000000')
],
[100, 200, 300, 400]
);
await tieredDiscount.deployed();
deployed.TieredDiscount = tieredDiscount.address;
console.log('TieredDiscount:', tieredDiscount.address);
// 2. Factory
console.log('\n--- Deploying Factory ---');
const VinuSwapFactory = await ethers.getContractFactory('VinuSwapFactory');
const factory = await VinuSwapFactory.deploy();
await factory.deployed();
deployed.VinuSwapFactory = factory.address;
console.log('VinuSwapFactory:', factory.address);
// 3. Controller
console.log('\n--- Deploying Controller ---');
const Controller = await ethers.getContractFactory('Controller');
const controller = await Controller.deploy(
factory.address,
config.FEE_ACCOUNTS,
config.FEE_SHARES
);
await controller.deployed();
deployed.Controller = controller.address;
console.log('Controller:', controller.address);
// Transfer ownership
await factory.setOwner(controller.address);
console.log('Factory ownership transferred');
// 4. SwapRouter
console.log('\n--- Deploying SwapRouter ---');
const SwapRouter = await ethers.getContractFactory('SwapRouter');
const router = await SwapRouter.deploy(factory.address, config.WVC);
await router.deployed();
deployed.SwapRouter = router.address;
console.log('SwapRouter:', router.address);
// 5. NFT Descriptor
console.log('\n--- Deploying NFT Contracts ---');
const NFTDescriptor = await ethers.getContractFactory('NFTDescriptor');
const nftDescriptor = await NFTDescriptor.deploy();
await nftDescriptor.deployed();
deployed.NFTDescriptor = nftDescriptor.address;
const Descriptor = await ethers.getContractFactory(
'NonfungibleTokenPositionDescriptor',
{ libraries: { NFTDescriptor: nftDescriptor.address } }
);
const descriptor = await Descriptor.deploy(
config.WVC,
ethers.utils.formatBytes32String(config.NATIVE_LABEL)
);
await descriptor.deployed();
deployed.NonfungibleTokenPositionDescriptor = descriptor.address;
// 6. Position Manager
const PositionManager = await ethers.getContractFactory(
'NonfungiblePositionManager'
);
const positionManager = await PositionManager.deploy(
factory.address,
config.WVC,
descriptor.address
);
await positionManager.deployed();
deployed.NonfungiblePositionManager = positionManager.address;
console.log('NonfungiblePositionManager:', positionManager.address);
// 7. Quoter
console.log('\n--- Deploying Quoter ---');
const Quoter = await ethers.getContractFactory('VinuSwapQuoter');
const quoter = await Quoter.deploy(factory.address, config.WVC);
await quoter.deployed();
deployed.VinuSwapQuoter = quoter.address;
console.log('VinuSwapQuoter:', quoter.address);
// Summary
console.log('\n=== DEPLOYMENT COMPLETE ===');
console.log(JSON.stringify(deployed, null, 2));
// Save to file
const fs = require('fs');
fs.writeFileSync(
'deployments/vinu.json',
JSON.stringify({
network: 'vinu',
chainId: 207,
deployer: deployer.address,
timestamp: new Date().toISOString(),
contracts: deployed
}, null, 2)
);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});