Hoodquidity: liquidity campaigns for Robinhood Chain stock token markets

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>
This commit is contained in:
Денис Зефиров 2026-07-11 08:31:01 +04:00
commit dba2811447
1194 changed files with 206422 additions and 0 deletions

View file

@ -0,0 +1,71 @@
// 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();
}
}

View file

@ -0,0 +1,26 @@
#!/usr/bin/env bash
# Local dev environment: anvil + multicall3 + demo deployment.
# Usage: ./script/setup-local.sh
set -euo pipefail
cd "$(dirname "$0")/.."
RPC=http://localhost:8545
# anvil default account #0
PK=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
MULTICALL3=0xcA11bde05977b3631167028862bE2a173976CA11
if ! cast chain-id --rpc-url $RPC >/dev/null 2>&1; then
echo "anvil is not running, start it with: anvil --port 8545"
exit 1
fi
# wagmi batches reads through multicall3, which vanilla anvil lacks
if [ "$(cast code $MULTICALL3 --rpc-url $RPC)" = "0x" ]; then
echo "etching multicall3..."
BYTECODE=$(cast code $MULTICALL3 --rpc-url https://1rpc.io/eth)
cast rpc anvil_setCode $MULTICALL3 "$BYTECODE" --rpc-url $RPC >/dev/null
fi
echo "deploying demo environment..."
PRIVATE_KEY=$PK forge script script/Deploy.s.sol --rpc-url $RPC --broadcast | grep -E "(hUSD|HoodquidityVaults|campaign)"
echo "done. Update apps/web/src/lib/contracts.ts if addresses changed."