Thanks man! I’ve got my betting contract with chainlink oracle all good to go in remix but it’s the bringing it over to truffle that has me stuck. I think it has something to do with the solidity version 0.6.6 not working with truffle because I get an error when importing the oracle contract, but when I try to use a higher version like 0.8.0, the oracle only seems to work with 0.6.6? Not quite sure. 
I’ve also tried to downgrade my truffle (someone recommended this online) but to no avail.

Here’s my code as well if you wanna check it out! Just waiting for @dan-i for some assistance 
pragma solidity 0.6.6;
import "https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/VRFConsumerBase.sol";
contract Betting is VRFConsumerBase {
uint public contractBalance;
//for chainlink oracle use
bytes32 internal keyHash;
uint256 internal fee;
uint256 public randomResult;
struct player {
address playerAddress;
uint balance;
uint bet;
bool waiting; //true if player waiting for oracle request
bool win; //true if last bet won
bytes32 requestId;
}
struct request {
bytes32 id;
address playerAddress;
uint256 random;
}
mapping(address => player) public players;
mapping(bytes32 => request) public requests;
event LogPlay(address playerAddress, uint bet, bytes32 requestId);
event LogGeneratedRandomNumber(bytes32 requestId, uint256 randomNumber);
event LogGameState(address playerAddress, uint playerBalance, bytes32 requestId, uint256 random, uint contractBalance);
event LogLinkBalance(uint256 linkBalance);
/*
* MODIFIERS
************************************************************************************************
*/
modifier initCosts(uint initCost){
require(msg.value >= initCost, "Contract needs minimum ether to initialize contract balance.");
_;
}
modifier costs(uint cost){
require(msg.value >= cost, "Minimum bet or deposit is 1 ether!");
_;
}
modifier ready() {
require(contractBalance > 0, "Cannot play. Contract balance is empty.");
require(players[msg.sender].waiting == false, "Cannot play. This player address is already playing and waiting on request.");
_;
}
modifier withdrawable() {
require(msg.sender != address(0));
require(players[msg.sender].balance > 0, "This address has no funds to withdraw.");
require(!players[msg.sender].waiting, "Cannot withdraw while waiting for oracle request.");
_;
}
/**
* Constructor inherits VRFConsumerBase
*
* Network: Kovan
* Chainlink VRF Coordinator address: 0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9
* LINK token address: 0xa36085F69e2889c224210F603D836748e7dC0088
* Key Hash: 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4
*/
constructor() public payable initCosts(0.05 ether) //init costs 50 finney (0.05 ether)
VRFConsumerBase(
0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9, // VRF Coordinator
0xa36085F69e2889c224210F603D836748e7dC0088 // LINK Token
)
{
keyHash = 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4;
fee = 0.1 * 10 ** 18; // 0.1 LINK
contractBalance += msg.value;
players[msg.sender].playerAddress = msg.sender;
players[msg.sender].balance = 0;
players[msg.sender].bet = 0;
players[msg.sender].waiting = false;
players[msg.sender].win = false;
players[msg.sender].requestId = 0;
emit LogGameState(players[msg.sender].playerAddress, players[msg.sender].balance, 0, 0, contractBalance);
}
function play() public payable costs(0.01 ether) ready {
players[msg.sender].playerAddress = msg.sender;
players[msg.sender].bet = msg.value;
players[msg.sender].waiting = true;
bytes32 newRequestId = getRandomNumber(0);
players[msg.sender].requestId = newRequestId;
requests[newRequestId].id = newRequestId;
requests[newRequestId].playerAddress = msg.sender;
emit LogPlay(players[msg.sender].playerAddress, players[msg.sender].bet, newRequestId);
}
function updateGame(bytes32 requestId) public {
address playerAddress = requests[requestId].playerAddress;
requests[requestId].random = randomResult;
if(requests[requestId].random % 2 == 1) {
players[playerAddress].win = true;
} else {
players[playerAddress].win = false;
}
updateBalances(playerAddress, requestId);
players[playerAddress].bet = 0;
players[playerAddress].waiting = false;
//delete(requests[requestId]);
}
function updateBalances(address playerAddress, bytes32 requestId) public {
if(players[playerAddress].win) {
players[playerAddress].balance += players[playerAddress].bet * 2;
contractBalance -= players[playerAddress].bet * 2;
} else {
contractBalance += players[playerAddress].bet;
}
emit LogGameState(
playerAddress,
players[playerAddress].balance,
requestId,
requests[requestId].random,
contractBalance
);
}
function logGameState() public {
emit LogGameState(
msg.sender,
players[msg.sender].balance,
players[msg.sender].requestId,
requests[players[msg.sender].requestId].random,
contractBalance
);
}
function withdrawPlayerBalance() public withdrawable {
uint amount = players[msg.sender].balance;
delete(players[msg.sender]);
msg.sender.transfer(amount);
emit LogGameState(
msg.sender,
players[msg.sender].balance,
players[msg.sender].requestId,
requests[players[msg.sender].requestId].random,
contractBalance
);
}
function withdrawContractBalance() public {
uint256 amount = contractBalance;
contractBalance = 0;
msg.sender.transfer(amount);
emit LogGameState(
msg.sender,
players[msg.sender].balance,
players[msg.sender].requestId,
requests[players[msg.sender].requestId].random,
contractBalance
);
}
function deposit() public payable costs(1 ether){
contractBalance += msg.value;
emit LogGameState(
msg.sender,
players[msg.sender].balance,
players[msg.sender].requestId,
requests[players[msg.sender].requestId].random,
contractBalance
);
}
/**
* Requests randomness from a user-provided seed
************************************************************************************
* STOP! *
* THIS FUNCTION WILL FAIL IF THIS CONTRACT DOES NOT OWN LINK *
* ---------------------------------------------------------- *
* Learn how to obtain testnet LINK and fund this contract: *
* ------- https://docs.chain.link/docs/acquire-link -------- *
* ---- https://docs.chain.link/docs/fund-your-contract ----- *
* *
************************************************************************************/
function getRandomNumber(uint256 userProvidedSeed) public returns (bytes32 requestId) {
require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet");
return requestRandomness(keyHash, fee, userProvidedSeed);
}
/**
* Callback function used by VRF Coordinator
*/
function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
randomResult = randomness;
requests[requestId].random = randomResult;
updateGame(requestId);
emit LogGeneratedRandomNumber(requestId, randomResult);
}
/**
* Withdraw LINK from this contract
*
* DO NOT USE THIS IN PRODUCTION AS IT CAN BE CALLED BY ANY ADDRESS.
* THIS IS PURELY FOR EXAMPLE PURPOSES.
*/
function withdrawLink() external {
require(LINK.transfer(msg.sender, LINK.balanceOf(address(this))), "Unable to transfer");
}
function getLinkBalance() public view returns (uint) {
return LINK.balanceOf(address(this));
}
function emitLinkBalance() public {
emit LogLinkBalance(LINK.balanceOf(address(this)));
}
/**
* GETTERS
* *********************************************************************************
*/
function getThisPlayer() public view returns (address playerAddress, uint balance, uint bet, bool waiting, bool win, bytes32 requestId, uint256 random) {
return (players[msg.sender].playerAddress,
players[msg.sender].balance,
players[msg.sender].bet,
players[msg.sender].waiting,
players[msg.sender].win,
players[msg.sender].requestId,
requests[players[msg.sender].requestId].random
);
}
function emitThisPlayer() public {
emit LogGameState(
msg.sender,
players[msg.sender].balance,
players[msg.sender].requestId,
requests[players[msg.sender].requestId].random,
contractBalance
);
}
function getPlayer(address _address) public returns (address playerAddress, uint balance, uint bet, bool waiting, bool win, bytes32 requestId, uint256 random) {
require(_address != address(0x0), "Player with this address does not exist.");
emit LogGameState(
msg.sender,
players[msg.sender].balance,
players[msg.sender].requestId,
requests[players[msg.sender].requestId].random,
contractBalance
);
return (players[_address].playerAddress,
players[_address].balance,
players[_address].bet,
players[_address].waiting,
players[_address].win,
players[_address].requestId,
requests[players[msg.sender].requestId].random
);
}
function getThisPlayerBalance() public view returns (uint) {
return players[msg.sender].balance;
}
function getPlayerBalance(address _address) public view returns (uint) {
return players[_address].balance;
}
function getContractBalance() public view returns (uint){
return contractBalance;
}
function getContractAddress() public view returns (address) {
return address(this);
}
function getSenderAddress() public view returns (address) {
return msg.sender;
}
}