// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {LinkTokenInterface} from "../../shared/interfaces/LinkTokenInterface.sol"; import {VRFCoordinatorV2Interface} from "../interfaces/VRFCoordinatorV2Interface.sol"; import {VRFConsumerBaseV2} from "../VRFConsumerBaseV2.sol"; contract VRFExternalSubOwnerExample is VRFConsumerBaseV2 { VRFCoordinatorV2Interface internal COORDINATOR; LinkTokenInterface internal LINKTOKEN; uint256[] public s_randomWords; uint256 public s_requestId; address internal s_owner; constructor(address vrfCoordinator, address link) VRFConsumerBaseV2(vrfCoordinator) { COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); LINKTOKEN = LinkTokenInterface(link); s_owner = msg.sender; } function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override { require(requestId == s_requestId, "request ID is incorrect"); s_randomWords = randomWords; } function requestRandomWords( uint64 subId, uint32 callbackGasLimit, uint16 requestConfirmations, uint32 numWords, bytes32 keyHash ) external onlyOwner { // Will revert if subscription is not funded. s_requestId = COORDINATOR.requestRandomWords(keyHash, subId, requestConfirmations, callbackGasLimit, numWords); } function transferOwnership(address newOwner) external onlyOwner { s_owner = newOwner; } modifier onlyOwner() { require(msg.sender == s_owner); _; } }