Skip to content

Commit ac70c3a

Browse files
Omid BodaghiOmid Bodaghi
authored andcommitted
Add deployment script
1 parent 3d9accf commit ac70c3a

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

script/DeployRaffle.s.sol

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
import {Script} from "forge-std/Script.sol";
5+
import {Raffle} from "src/Raffle.sol";
6+
import {HelperConfig} from "script/HelperConfig.s.sol";
7+
8+
contract DeployRaffle is Script {
9+
function run() public {}
10+
11+
function deployContract() public returns (Raffle, HelperConfig) {
12+
HelperConfig helperConfig = new HelperConfig();
13+
HelperConfig.NetworkConfig memory config = helperConfig.getConfig();
14+
15+
vm.startBroadcast();
16+
Raffle raffle = new Raffle(
17+
config.entranceFee,
18+
config.interval,
19+
config.vrfCoordinator,
20+
config.gasLane,
21+
config.subscriptionId,
22+
config.callbackGasLimit
23+
);
24+
vm.stopBroadcast();
25+
return (raffle, helperConfig);
26+
}
27+
}

script/HelperConfig.s.sol

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.18;
3+
4+
import {Script} from "forge-std/Script.sol";
5+
import {VRFCoordinatorV2_5Mock} from "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2_5Mock.sol";
6+
7+
abstract contract CodeConstants {
8+
/* VRF Mock Values*/
9+
uint96 public MOCK_BASE_FEE = 0.25 ether;
10+
uint96 public MOCK_GAS_PRICE_LINK = 1e9;
11+
// LINK/ETH Price
12+
int256 public MOCK_WEI_PER_UINT_LINK = 4e15;
13+
14+
uint256 public constant ETH_SEPOLIA_CHAIN_ID = 11155111;
15+
uint256 public constant LOCAL_CHAIN_ID = 31337;
16+
}
17+
18+
contract HelperConfig is CodeConstants, Script {
19+
error HelperConfig__InvalidChainId();
20+
21+
struct NetworkConfig {
22+
uint256 entranceFee;
23+
uint256 interval;
24+
address vrfCoordinator;
25+
bytes32 gasLane;
26+
uint256 subscriptionId;
27+
uint32 callbackGasLimit;
28+
}
29+
30+
NetworkConfig public localNetworkConfig;
31+
mapping(uint256 chainId => NetworkConfig) public networkConfigs;
32+
33+
constructor() {
34+
networkConfigs[ETH_SEPOLIA_CHAIN_ID] = getSepoliaEthConfig();
35+
}
36+
37+
function getConfigByChainId(uint256 chainId) public returns (NetworkConfig memory) {
38+
if (networkConfigs[chainId].vrfCoordinator != address(0)) {
39+
return networkConfigs[chainId];
40+
} else if (chainId == LOCAL_CHAIN_ID) {
41+
return getOrCreateAnvilEthConfig();
42+
} else {
43+
revert HelperConfig__InvalidChainId();
44+
}
45+
}
46+
47+
function getConfig() public returns (NetworkConfig memory) {
48+
return getConfigByChainId(block.chainid);
49+
}
50+
51+
function getSepoliaEthConfig() public pure returns (NetworkConfig memory) {
52+
return NetworkConfig({
53+
entranceFee: 0.01 ether,
54+
interval: 30, // every 30 seconds
55+
vrfCoordinator: 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625,
56+
gasLane: 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c,
57+
callbackGasLimit: 500000,
58+
subscriptionId: 0
59+
});
60+
}
61+
62+
function getOrCreateAnvilEthConfig() public returns (NetworkConfig memory) {
63+
if (localNetworkConfig.vrfCoordinator != address(0)) {
64+
return localNetworkConfig;
65+
}
66+
67+
// Deploy mocks
68+
vm.startBroadcast();
69+
VRFCoordinatorV2_5Mock vrfCoordinator =
70+
new VRFCoordinatorV2_5Mock(MOCK_BASE_FEE, MOCK_GAS_PRICE_LINK, MOCK_WEI_PER_UINT_LINK);
71+
vm.stopBroadcast();
72+
73+
localNetworkConfig = NetworkConfig({
74+
entranceFee: 0.01 ether,
75+
interval: 30, // every 30 seconds
76+
vrfCoordinator: address(vrfCoordinator),
77+
gasLane: 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c,
78+
callbackGasLimit: 500000,
79+
subscriptionId: 0
80+
});
81+
return localNetworkConfig;
82+
}
83+
}

0 commit comments

Comments
 (0)