// SPDX-License-Identifier: MIT pragma solidity ^0.8.26; import {Script, console} from "forge-std/Script.sol"; import {HoodquidityVaults} from "../src/HoodquidityVaults.sol"; import {MockERC20} from "../src/MockERC20.sol"; import {MockV3Aggregator} from "../src/MockV3Aggregator.sol"; /// @notice Deploys the demo environment: test USD, five stock tokens with /// Chainlink-style price feeds and five liquidity campaigns matching /// the launch set. contract Deploy is Script { struct Market { string name; string symbol; uint128 targetDepth; uint128 rewardBudget; uint64 duration; int256 price; // 8 decimals, seeded from live quotes } function run() external { uint256 pk = vm.envUint("PRIVATE_KEY"); address deployer = vm.addr(pk); vm.startBroadcast(pk); MockERC20 usd = new MockERC20("Hood USD", "hUSD", 6, 10_000e6); HoodquidityVaults vaults = new HoodquidityVaults(deployer); Market[5] memory markets = [ Market("NVIDIA Stock Token", "NVDA", 1_000_000e6, 50_000e6, 14 days, 208e8), Market("Tesla Stock Token", "TSLA", 750_000e6, 40_000e6, 14 days, 400e8), Market("Apple Stock Token", "AAPL", 500_000e6, 25_000e6, 21 days, 315e8), Market("SPDR S&P 500 Token", "SPY", 2_000_000e6, 60_000e6, 30 days, 756e8), Market("AI Basket Token", "AIB", 400_000e6, 35_000e6, 14 days, 294e8) ]; uint64 start = uint64(block.timestamp + 10 minutes); uint128 totalBudget = 0; for (uint256 i = 0; i < markets.length; i++) { totalBudget += markets[i].rewardBudget; } usd.mint(deployer, totalBudget); usd.approve(address(vaults), totalBudget); console.log("hUSD:", address(usd)); console.log("HoodquidityVaults:", address(vaults)); for (uint256 i = 0; i < markets.length; i++) { MockERC20 stock = new MockERC20(markets[i].name, markets[i].symbol, 18, 10e18); MockV3Aggregator feed = new MockV3Aggregator( 8, string.concat(markets[i].symbol, " / USD"), markets[i].price ); uint256 id = vaults.createCampaign( address(usd), address(stock), address(feed), start, start + markets[i].duration, 1 days, // boost window 15_000, // 1.5x early boost markets[i].targetDepth, markets[i].rewardBudget ); console.log(markets[i].symbol, address(stock), "campaign", id); console.log(string.concat(markets[i].symbol, " feed:"), address(feed)); } vm.stopBroadcast(); } }