Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
iamshuge committed Sep 29, 2024
1 parent 23122ad commit 06c4722
Show file tree
Hide file tree
Showing 12 changed files with 742 additions and 44 deletions.
9 changes: 9 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
[submodule "lib/forge-std"]
path = lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "lib/chainlink-brownie-contracts"]
path = lib/chainlink-brownie-contracts
url = https://github.com/smartcontractkit/chainlink-brownie-contracts
[submodule "lib/solmate"]
path = lib/solmate
url = https://github.com/transmissions11/solmate
[submodule "lib/foundry-devops"]
path = lib/foundry-devops
url = https://github.com/Cyfrin/foundry-devops
3 changes: 2 additions & 1 deletion foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
src = "src"
out = "out"
libs = ["lib"]

remappings =['@chainlink/contracts/=lib/chainlink-brownie-contracts/contracts/']
# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options

19 changes: 0 additions & 19 deletions script/Counter.s.sol

This file was deleted.

53 changes: 53 additions & 0 deletions script/DeployRaffle.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

import {Script} from "forge-std/Script.sol";
import {Raffle} from "../src/Raffle.sol";
import {HelperConfig} from "./HelperConfig.s.sol";
import {CreateSubscription, FundSubscription, AddConsumer} from "./Interaction.s.sol";

contract DeployRaffle is Script{
function run() external returns(Raffle, HelperConfig) {
HelperConfig helperConfig = new HelperConfig();
(
uint256 entranceFee,
uint256 interval,
address vrfCoordinator,
bytes32 gasLane,
uint64 subscriptionId,
uint32 callbackGasLimit,
address link,
uint256 deployKey
) = helperConfig.activeNetworkConfig(); // 末尾要加上(),不然只是一个变量

if (subscriptionId == 0){
CreateSubscription createSubscription = new CreateSubscription();
subscriptionId = createSubscription.createSubscription(vrfCoordinator);

// FUND
FundSubscription fundSubscription = new FundSubscription();
fundSubscription.fundSubscription(
vrfCoordinator,
subscriptionId,
link
);
}

vm.startBroadcast();
Raffle raffle = new Raffle(
entranceFee,
interval,
vrfCoordinator,
gasLane,
subscriptionId,
callbackGasLimit
);
vm.stopBroadcast();

AddConsumer addConsumer = new AddConsumer();
addConsumer.addConsumer(address(raffle), vrfCoordinator, subscriptionId, deployKey);

return (raffle, helperConfig);
}
}
75 changes: 75 additions & 0 deletions script/HelperConfig.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

import {Script} from "forge-std/Script.sol";
import {VRFCoordinatorV2Mock} from "@chainlink/contracts/src/v0.8/mocks/VRFCoordinatorV2Mock.sol";
import {LinkToken} from "test/mocks/LinkToken.sol";

contract HelperConfig is Script {

struct NetworkConfig {
uint256 entranceFee;
uint256 interval;
address vrfCoordinator;
bytes32 gasLane;
uint64 subscriptionId;
uint32 callbackGasLimit;
address link;
uint256 deployKey;
}

address public FOUNDRY_DEFAULT_SENDER = 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38;
uint256 public FOUNDRY_DEFAULT_SENDER_KEY = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80;
NetworkConfig public activeNetworkConfig;

constructor(){
if (block.chainid == 11155111){
activeNetworkConfig = getSepoliaEthConfig();
} else {
activeNetworkConfig = getOrCreatAnvilEthConfig();
}
}

function getSepoliaEthConfig() public view returns(NetworkConfig memory){
return NetworkConfig({
entranceFee: 0.01 ether,
interval: 30,
vrfCoordinator: 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625,
gasLane: 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c,
subscriptionId: 0,
callbackGasLimit: 500000,
link: 0x779877A7B0D9E8603169DdbD7836e478b4624789,
deployKey: vm.envUint("PRIVATE_KEY") // 放置自己钱包的私钥
});
}

function getOrCreatAnvilEthConfig() public returns(NetworkConfig memory){

if (activeNetworkConfig.vrfCoordinator != address(0)) {
return activeNetworkConfig;
}

uint96 baseFee = 0.25 ether; // 0.25 LINK
uint96 gaspriceLink = 1e9; // 1 gwei LINK
vm.startBroadcast();
VRFCoordinatorV2Mock vrfCoordinatorV2Mock = new VRFCoordinatorV2Mock(
baseFee,
gaspriceLink
);
LinkToken link = new LinkToken();

vm.stopBroadcast();

return NetworkConfig({
entranceFee: 0.01 ether,
interval: 30,
vrfCoordinator: address(vrfCoordinatorV2Mock),
gasLane: 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c,
subscriptionId: 0,
callbackGasLimit: 500000,
link: address(link),
deployKey: FOUNDRY_DEFAULT_SENDER_KEY
});
}
}
128 changes: 128 additions & 0 deletions script/Interaction.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

import {Script,console} from "forge-std/Script.sol";
import {HelperConfig} from "./HelperConfig.s.sol";
import {VRFCoordinatorV2Mock} from "lib/chainlink-brownie-contracts/contracts/src/v0.8/mocks/VRFCoordinatorV2Mock.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(uint64) {
HelperConfig helperConfig = new HelperConfig();
(, , address vrfCoordinator, , , , ,) = helperConfig.activeNetworkConfig();
return createSubscription(vrfCoordinator);
}

function createSubscription(address vrfCoordinator) public returns(uint64){
console.log("ChainId is:", block.chainid);

vm.startBroadcast();
uint64 subId = VRFCoordinatorV2Mock(vrfCoordinator).createSubscription();
vm.stopBroadcast();
console.log("Your sub Id is:", subId);
console.log("Please update subscriptionId in HelperConfig.s.sol");

return subId;
}

function run() external returns (uint64) {
return createSubscriptionUsingConfig();
}
}

contract FundSubscription is Script {
uint96 public constant FUND_AMOUNT = 3 ether;

function fundSubscriptionUsingConfig() public {
HelperConfig helperConfig = new HelperConfig();
(
,
,
address vrfCoordinator,
,
uint64 subId,
,
address link,
uint256 deployKey) = helperConfig.activeNetworkConfig();
fundSubscription(vrfCoordinator,subId,link);
}

function fundSubscription(
address vrfCoordinator,
uint64 subId,
address link
) public {
console.log("Funding subscription:", subId);
console.log("Using vrfCoordinator:", vrfCoordinator);
console.log("On ChainID:", block.chainid);

if (block.chainid == 31337){
vm.startBroadcast();

VRFCoordinatorV2Mock(vrfCoordinator).fundSubscription(
subId,
FUND_AMOUNT
);

vm.stopBroadcast();
} else {
vm.startBroadcast();

LinkToken(link).transferAndCall(
vrfCoordinator,
FUND_AMOUNT,
abi.encode(subId)
);

vm.stopBroadcast();
}
}

function run() external {
fundSubscriptionUsingConfig();
}

}

contract AddConsumer is Script {

function addConsumerUsingConfig(address raffle) public {
HelperConfig helperConfig = new HelperConfig();
(
,
,
address vrfCoordinator,
,
uint64 subId,
,
,
uint256 deployKey
) = helperConfig.activeNetworkConfig();
addConsumer(raffle,vrfCoordinator,subId,deployKey);
}

function addConsumer(
address raffle,
address vrfCoordinator,
uint64 subId,
uint256 deployKey
) public {
console.log("Adding consumer contract:", raffle);
console.log("Using vrfCoordinator:", vrfCoordinator);
console.log("On ChainID:", block.chainid);

vm.startBroadcast(0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38);
// vm.startBroadcast(deployKey)
VRFCoordinatorV2Mock(vrfCoordinator).addConsumer(subId, raffle);
vm.stopBroadcast();
}

function run() external {
address raffle = DevOpsTools.get_most_recent_deployment("MyContract", block.chainid);
addConsumerUsingConfig(raffle);
}

}
Loading

0 comments on commit 06c4722

Please sign in to comment.