smart-contracts/lottery/script/Interactions.s.sol
2025-01-06 21:19:15 +07:00

93 lines
3.6 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
import {Script, console} from "forge-std/Script.sol";
import {HelperConfig, CodeConstants} from "script/HelperConfig.s.sol";
import {VRFCoordinatorV2_5Mock} from "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2_5Mock.sol";
import {LinkToken} from "test/mocks/LinkToken.sol";
import {DevOpsTools} from "lib/foundry-devops/src/DevOpsTools.sol";
contract CreateSubscription is Script {
function createSubscriptionUsingConfig() public returns (uint256, address) {
HelperConfig helperConfig = new HelperConfig();
address vrfCoordinator = helperConfig.getConfig().vrfCoordinator;
address account = helperConfig.getConfig().account;
// create subscription
(uint256 subId, ) = createSubscription(vrfCoordinator, account);
return (subId, vrfCoordinator);
}
function createSubscription(address vrfCoordinator, address account) public returns (uint256, address) {
console.log("Creating subscription on chain Id: ", block.chainid);
vm.startBroadcast(account);
uint256 subId = VRFCoordinatorV2_5Mock(vrfCoordinator).createSubscription();
vm.stopBroadcast();
console.log("Your subscription Id is: ", subId);
console.log("Please update the subscription Id in your HelperConfig.s.sol");
return (subId, vrfCoordinator);
}
function run() public {
createSubscriptionUsingConfig();
}
}
contract FundSubscription is Script, CodeConstants {
uint256 public constant FUND_AMOUNT = 3 ether; // equals to 3 LINK
function fundSubscriptionUsingConfig() public {
HelperConfig helperConfig = new HelperConfig();
address vrfCoordinator = helperConfig.getConfig().vrfCoordinator;
uint256 subscriptionId = helperConfig.getConfig().subscriptionId;
address linkToken = helperConfig.getConfig().link;
address account = helperConfig.getConfig().account;
fundSubscription(vrfCoordinator, subscriptionId, linkToken, account);
}
function fundSubscription(address vrfCoordinator, uint256 subscriptionId, address linkToken, address account) public {
console.log("Funding subscription: ", subscriptionId);
console.log("Using vrfCoordinator: ", vrfCoordinator);
console.log("On ChainiId: ", block.chainid);
if (block.chainid == LOCAL_CHAIN_ID) {
vm.startBroadcast();
VRFCoordinatorV2_5Mock(vrfCoordinator).fundSubscription(subscriptionId, FUND_AMOUNT * 100);
vm.stopBroadcast();
} else {
vm.startBroadcast(account);
LinkToken(linkToken).transferAndCall(vrfCoordinator, FUND_AMOUNT, abi.encode(subscriptionId));
vm.stopBroadcast();
}
}
function run() public {
fundSubscriptionUsingConfig();
}
}
contract AddConsumer is Script {
function addConsumerUsingConfig(address mostRecentlyDeployed) public {
HelperConfig helperConfig = new HelperConfig();
uint256 subId = helperConfig.getConfig().subscriptionId;
address vrfCoordinator = helperConfig.getConfig().vrfCoordinator;
address account = helperConfig.getConfig().account;
addConsumer(mostRecentlyDeployed, vrfCoordinator, subId, account);
}
function addConsumer(address contractToAddToVrf, address vrfCoordinator, uint256 subId, address account) public {
console.log("Adding consumer contract: ", contractToAddToVrf);
console.log("To vrfCoordinator: ", vrfCoordinator);
console.log("On ChainId: ", block.chainid);
vm.startBroadcast(account);
VRFCoordinatorV2_5Mock(vrfCoordinator).addConsumer(subId, contractToAddToVrf);
vm.stopBroadcast();
}
function run() external {
address mostRecentlyDeployed = DevOpsTools.get_most_recent_deployment("Raffle", block.chainid);
addConsumerUsingConfig(mostRecentlyDeployed);
}
}