Full build: Vite/React acid-terminal frontend (BEARER design system, Panchang/Sentient/Fragment Mono, neon layer, palette audit script), HoodquidityVaults Foundry contracts (single+dual deposits via Chainlink-style feeds, hybrid exit, 10% platform fee, boost, Genesis LP), Reown AppKit wallet connect with Robinhood Chain testnet (46630), live data from Dexscreener and onchain reads, partner portal, design-sync setup for claude.ai/design. Deploy: static via Forgejo Actions platform, BUILD_DIR=apps/web/dist (.env). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
71 lines
2.7 KiB
Solidity
71 lines
2.7 KiB
Solidity
// 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();
|
|
}
|
|
}
|