Skip to main content

VRFCoordinatorV2

VRFCoordinatorV2​

contract LinkTokenInterface LINK
contract AggregatorV3Interface LINK_ETH_FEED

BLOCKHASH_STORE​

contract BlockhashStoreInterface BLOCKHASH_STORE

MAX_CONSUMERS​

uint16 MAX_CONSUMERS

TooManyConsumers​

error TooManyConsumers()

InsufficientBalance​

error InsufficientBalance()

InvalidConsumer​

error InvalidConsumer(uint64 subId, address consumer)

InvalidSubscription​

error InvalidSubscription()
error OnlyCallableFromLink()

InvalidCalldata​

error InvalidCalldata()

MustBeSubOwner​

error MustBeSubOwner(address owner)

PendingRequestExists​

error PendingRequestExists()

MustBeRequestedOwner​

error MustBeRequestedOwner(address proposedOwner)

BalanceInvariantViolated​

error BalanceInvariantViolated(uint256 internalBalance, uint256 externalBalance)

FundsRecovered​

event FundsRecovered(address to, uint256 amount)

Subscription​

struct Subscription {
uint96 balance;
uint64 reqCount;
}

SubscriptionConfig​

struct SubscriptionConfig {
address owner;
address requestedOwner;
address[] consumers;
}

s_consumers​

mapping(address => mapping(uint64 => uint64)) s_consumers

s_subscriptionConfigs​

mapping(uint64 => struct VRFCoordinatorV2.SubscriptionConfig) s_subscriptionConfigs

s_subscriptions​

mapping(uint64 => struct VRFCoordinatorV2.Subscription) s_subscriptions

s_currentSubId​

uint64 s_currentSubId

s_totalBalance​

uint96 s_totalBalance

SubscriptionCreated​

event SubscriptionCreated(uint64 subId, address owner)

SubscriptionFunded​

event SubscriptionFunded(uint64 subId, uint256 oldBalance, uint256 newBalance)

SubscriptionConsumerAdded​

event SubscriptionConsumerAdded(uint64 subId, address consumer)

SubscriptionConsumerRemoved​

event SubscriptionConsumerRemoved(uint64 subId, address consumer)

SubscriptionCanceled​

event SubscriptionCanceled(uint64 subId, address to, uint256 amount)

SubscriptionOwnerTransferRequested​

event SubscriptionOwnerTransferRequested(uint64 subId, address from, address to)

SubscriptionOwnerTransferred​

event SubscriptionOwnerTransferred(uint64 subId, address from, address to)

MAX_REQUEST_CONFIRMATIONS​

uint16 MAX_REQUEST_CONFIRMATIONS

MAX_NUM_WORDS​

uint32 MAX_NUM_WORDS

GAS_FOR_CALL_EXACT_CHECK​

uint256 GAS_FOR_CALL_EXACT_CHECK

InvalidRequestConfirmations​

error InvalidRequestConfirmations(uint16 have, uint16 min, uint16 max)

GasLimitTooBig​

error GasLimitTooBig(uint32 have, uint32 want)

NumWordsTooBig​

error NumWordsTooBig(uint32 have, uint32 want)

ProvingKeyAlreadyRegistered​

error ProvingKeyAlreadyRegistered(bytes32 keyHash)

NoSuchProvingKey​

error NoSuchProvingKey(bytes32 keyHash)

InvalidLinkWeiPrice​

error InvalidLinkWeiPrice(int256 linkWei)

InsufficientGasForConsumer​

error InsufficientGasForConsumer(uint256 have, uint256 want)

NoCorrespondingRequest​

error NoCorrespondingRequest()

IncorrectCommitment​

error IncorrectCommitment()

BlockhashNotInStore​

error BlockhashNotInStore(uint256 blockNum)

PaymentTooLarge​

error PaymentTooLarge()

Reentrant​

error Reentrant()

RequestCommitment​

struct RequestCommitment {
uint64 blockNum;
uint64 subId;
uint32 callbackGasLimit;
uint32 numWords;
address sender;
}

s_provingKeys​

mapping(bytes32 => address) s_provingKeys

s_provingKeyHashes​

bytes32[] s_provingKeyHashes

s_withdrawableTokens​

mapping(address => uint96) s_withdrawableTokens

s_requestCommitments​

mapping(uint256 => bytes32) s_requestCommitments

ProvingKeyRegistered​

event ProvingKeyRegistered(bytes32 keyHash, address oracle)

ProvingKeyDeregistered​

event ProvingKeyDeregistered(bytes32 keyHash, address oracle)

RandomWordsRequested​

event RandomWordsRequested(bytes32 keyHash, uint256 requestId, uint256 preSeed, uint64 subId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, uint32 numWords, address sender)

RandomWordsFulfilled​

event RandomWordsFulfilled(uint256 requestId, uint256 outputSeed, uint96 payment, bool success)

Config​

struct Config {
uint16 minimumRequestConfirmations;
uint32 maxGasLimit;
bool reentrancyLock;
uint32 stalenessSeconds;
uint32 gasAfterPaymentCalculation;
}
int256 s_fallbackWeiPerUnitLink

s_config​

struct VRFCoordinatorV2.Config s_config

s_feeConfig​

struct VRFCoordinatorV2.FeeConfig s_feeConfig

FeeConfig​

struct FeeConfig {
uint32 fulfillmentFlatFeeLinkPPMTier1;
uint32 fulfillmentFlatFeeLinkPPMTier2;
uint32 fulfillmentFlatFeeLinkPPMTier3;
uint32 fulfillmentFlatFeeLinkPPMTier4;
uint32 fulfillmentFlatFeeLinkPPMTier5;
uint24 reqsForTier2;
uint24 reqsForTier3;
uint24 reqsForTier4;
uint24 reqsForTier5;
}

ConfigSet​

event ConfigSet(uint16 minimumRequestConfirmations, uint32 maxGasLimit, uint32 stalenessSeconds, uint32 gasAfterPaymentCalculation, int256 fallbackWeiPerUnitLink, struct VRFCoordinatorV2.FeeConfig feeConfig)

Request​

struct Request {
uint64 subId;
uint32 callbackGasLimit;
uint32 numWords;
}

s_requests​

mapping(uint256 => struct VRFCoordinatorV2.Request) s_requests

constructor​

constructor(address link, address blockhashStore, address linkEthFeed) public

registerProvingKey​

function registerProvingKey(address oracle, uint256[2] publicProvingKey) external

Registers a proving key to an oracle.

NameTypeDescription
oracleaddressaddress of the oracle
publicProvingKeyuint256[2]key that oracle can use to submit vrf fulfillments

deregisterProvingKey​

function deregisterProvingKey(uint256[2] publicProvingKey) external

Deregisters a proving key to an oracle.

NameTypeDescription
publicProvingKeyuint256[2]key that oracle can use to submit vrf fulfillments

hashOfKey​

function hashOfKey(uint256[2] publicKey) public pure returns (bytes32)

Returns the proving key hash key associated with this public key

NameTypeDescription
publicKeyuint256[2]the key to return the hash of

setConfig​

function setConfig(uint16 minimumRequestConfirmations, uint32 maxGasLimit, uint32 stalenessSeconds, uint32 gasAfterPaymentCalculation, int256 fallbackWeiPerUnitLink, struct VRFCoordinatorV2.FeeConfig feeConfig) external

Sets the configuration of the vrfv2 coordinator

NameTypeDescription
minimumRequestConfirmationsuint16global min for request confirmations
maxGasLimituint32global max for request gas limit
stalenessSecondsuint32if the eth/link feed is more stale then this, use the fallback price
gasAfterPaymentCalculationuint32gas used in doing accounting after completing the gas measurement
fallbackWeiPerUnitLinkint256fallback eth/link price in the case of a stale feed
feeConfigstruct VRFCoordinatorV2.FeeConfigfee tier configuration

getConfig​

function getConfig() external view returns (uint16 minimumRequestConfirmations, uint32 maxGasLimit, uint32 stalenessSeconds, uint32 gasAfterPaymentCalculation)

getFeeConfig​

function getFeeConfig() external view returns (uint32 fulfillmentFlatFeeLinkPPMTier1, uint32 fulfillmentFlatFeeLinkPPMTier2, uint32 fulfillmentFlatFeeLinkPPMTier3, uint32 fulfillmentFlatFeeLinkPPMTier4, uint32 fulfillmentFlatFeeLinkPPMTier5, uint24 reqsForTier2, uint24 reqsForTier3, uint24 reqsForTier4, uint24 reqsForTier5)

getTotalBalance​

function getTotalBalance() external view returns (uint256)
function getFallbackWeiPerUnitLink() external view returns (int256)

ownerCancelSubscription​

function ownerCancelSubscription(uint64 subId) external

Owner cancel subscription, sends remaining link directly to the subscription owner.

notably can be called even if there are pending requests, outstanding ones may fail onchain

NameTypeDescription
subIduint64subscription id

recoverFunds​

function recoverFunds(address to) external

Recover link sent with transfer instead of transferAndCall.

NameTypeDescription
toaddressaddress to send link to

getRequestConfig​

function getRequestConfig() external view returns (uint16, uint32, bytes32[])

Get configuration relevant for making requests

NameTypeDescription
[0]uint16minimumRequestConfirmations global min for request confirmations
[1]uint32maxGasLimit global max for request gas limit
[2]bytes32[]s_provingKeyHashes list of registered key hashes

requestRandomWords​

function requestRandomWords(bytes32 keyHash, uint64 subId, uint16 requestConfirmations, uint32 callbackGasLimit, uint32 numWords) external returns (uint256)

Request a set of random words.

NameTypeDescription
keyHashbytes32- Corresponds to a particular oracle job which uses that key for generating the VRF proof. Different keyHash's have different gas price ceilings, so you can select a specific one to bound your maximum per request cost.
subIduint64- The ID of the VRF subscription. Must be funded with the minimum subscription balance required for the selected keyHash.
requestConfirmationsuint16
callbackGasLimituint32- How much gas you'd like to receive in your fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords may be slightly less than this amount because of gas used calling the function (argument decoding etc.), so you may need to request slightly more than you expect to have inside fulfillRandomWords. The acceptable range is [0, maxGasLimit]
numWordsuint32- The number of uint256 random values you'd like to receive in your fulfillRandomWords callback. Note these numbers are expanded in a secure way by the VRFCoordinator from a single random value supplied by the oracle.
NameTypeDescription
[0]uint256

getCommitment​

function getCommitment(uint256 requestId) external view returns (bytes32)

Get request commitment

used to determine if a request is fulfilled or not

NameTypeDescription
requestIduint256id of request

computeRequestId​

function computeRequestId(bytes32 keyHash, address sender, uint64 subId, uint64 nonce) private pure returns (uint256, uint256)

callWithExactGas​

function callWithExactGas(uint256 gasAmount, address target, bytes data) private returns (bool success)

calls target address with exactly gasAmount gas and data as calldata or reverts if at least gasAmount gas is not available.

getFeeTier​

function getFeeTier(uint64 reqCount) public view returns (uint32)

fulfillRandomWords​

function fulfillRandomWords(uint256 _requestId, address _consumer) external returns (uint96)

calculatePaymentAmount​

function calculatePaymentAmount(uint256 startGas, uint256 gasAfterPaymentCalculation, uint32 fulfillmentFlatFeeLinkPPM, uint256 weiPerUnitGas) internal view returns (uint96)

getFeedData​

function getFeedData() private view returns (int256)

oracleWithdraw​

function oracleWithdraw(address recipient, uint96 amount) external

onTokenTransfer​

function onTokenTransfer(address, uint256 amount, bytes data) external

getCurrentSubId​

function getCurrentSubId() external view returns (uint64)

getSubscription​

function getSubscription(uint64 subId) external view returns (uint96 balance, uint64 reqCount, address owner, address[] consumers)

Get a VRF subscription.

NameTypeDescription
subIduint64- ID of the subscription
NameTypeDescription
balanceuint96- LINK balance of the subscription in juels.
reqCountuint64- number of requests for this subscription, determines fee tier.
owneraddress- owner of the subscription.
consumersaddress[]- list of consumer address which are able to use this subscription.

createSubscription​

function createSubscription() external returns (uint64)

Create a VRF subscription.

You can manage the consumer set dynamically with addConsumer/removeConsumer. Note to fund the subscription, use transferAndCall. For example LINKTOKEN.transferAndCall( address(COORDINATOR), amount, abi.encode(subId));

NameTypeDescription
[0]uint64

requestSubscriptionOwnerTransfer​

function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external

Request subscription owner transfer.

NameTypeDescription
subIduint64- ID of the subscription
newOwneraddress- proposed new owner of the subscription

acceptSubscriptionOwnerTransfer​

function acceptSubscriptionOwnerTransfer(uint64 subId) external

Request subscription owner transfer.

will revert if original owner of subId has not requested that msg.sender become the new owner.

NameTypeDescription
subIduint64- ID of the subscription

removeConsumer​

function removeConsumer(uint64 subId, address consumer) external

Remove a consumer from a VRF subscription.

NameTypeDescription
subIduint64- ID of the subscription
consumeraddress- Consumer to remove from the subscription

addConsumer​

function addConsumer(uint64 subId, address consumer) external

Add a consumer to a VRF subscription.

NameTypeDescription
subIduint64- ID of the subscription
consumeraddress- New consumer which can use the subscription

cancelSubscription​

function cancelSubscription(uint64 subId, address to) external

Cancel a subscription

NameTypeDescription
subIduint64- ID of the subscription
toaddress- Where to send the remaining LINK to

cancelSubscriptionHelper​

function cancelSubscriptionHelper(uint64 subId, address to) private

onlySubOwner​

modifier onlySubOwner(uint64 subId)

nonReentrant​

modifier nonReentrant()

typeAndVersion​

function typeAndVersion() external pure virtual returns (string)

The type and version of this contract

NameTypeDescription
[0]stringType and version string