// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.24; import {Script, console} from "forge-std/Script.sol"; import {IERC20} from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import {RUSD} from "../src/RUSD.sol"; import {MarketRegistry} from "../src/MarketRegistry.sol"; import {RiskVault} from "../src/RiskVault.sol"; import {FeeSplitter} from "../src/FeeSplitter.sol"; import {RiskEngine, IRandomnessProvider} from "../src/RiskEngine.sol"; import {VRFAdapter, IRiskEngineCallback} from "../src/VRFAdapter.sol"; /// Demo (play-money) stack: RUSD token + full protocol, Arbitrum One. /// env: PRIVATE_KEY, VRF_COORDINATOR, VRF_KEY_HASH, VRF_SUB_ID contract DeployDemo is Script { function run() external { uint256 pk = vm.envUint("PRIVATE_KEY"); address deployer = vm.addr(pk); address coordinator = vm.envAddress("VRF_COORDINATOR"); bytes32 keyHash = vm.envBytes32("VRF_KEY_HASH"); uint256 subId = vm.envUint("VRF_SUB_ID"); vm.startBroadcast(pk); RUSD rusd = new RUSD(deployer); MarketRegistry registry = new MarketRegistry(deployer); RiskVault vault = new RiskVault(IERC20(address(rusd)), deployer, 100_000_000e6); FeeSplitter splitter = new FeeSplitter(IERC20(address(rusd)), deployer, deployer, deployer, deployer); VRFAdapter vrf = new VRFAdapter(coordinator, keyHash, subId, deployer); RiskEngine engine = new RiskEngine(registry, vault, splitter, IRandomnessProvider(address(vrf)), deployer); vault.setEngine(address(engine)); splitter.setEngine(address(engine)); vrf.setEngine(IRiskEngineCallback(address(engine))); _listLaunchMarkets(registry); // seed house bankroll: 10M RUSD rusd.approve(address(vault), 10_000_000e6); vault.deposit(10_000_000e6, deployer); vm.stopBroadcast(); console.log("RUSD: ", address(rusd)); console.log("MarketRegistry:", address(registry)); console.log("RiskVault: ", address(vault)); console.log("FeeSplitter: ", address(splitter)); console.log("VRFAdapter: ", address(vrf)); console.log("RiskEngine: ", address(engine)); } function _listLaunchMarkets(MarketRegistry r) internal { _list2(r, 500_000, 1_975_000); _list2(r, 246_875, 4_000_000); _list2(r, 98_750, 10_000_000); _list2(r, 27_027, 36_537_500); _list2(r, 9_901, 99_737_500); } function _list2(MarketRegistry r, uint32 winP, uint64 payoutX) internal { uint32[] memory p = new uint32[](2); uint64[] memory x = new uint64[](2); p[0] = winP; x[0] = payoutX; p[1] = 1_000_000 - winP; x[1] = 0; r.listMarket(p, x); } }