Crypto Drop - Smart Contract Audit Report

Summary

CryptoDrop is a new yield farming protocol that features a lottery mechanism for earning BNB and BEP20 token rewards.

For this audit we reviewed the teams Staking, Storage, and Lottery contracts that were provided to us by the team.

CryptoDrop Staking Contracts:
  • Users can deposit CryptoDrop tokens into the Staking contract in order to earn BNB as well as various tokens set by the owner as rewards.
  • The team must exercise caution when setting the reward tokens and must avoid using any fee-on-transfer token or ERC777-compliant tokens.
  • The owner can assign multiple addresses to an authorized role. The assigned addresses have access to specific functions in the contract.
  • The rewards that a user earns is based on the amount of CryptoDrop tokens being staked, and the current Distribution rate(s) at the time a user is claiming, which is set by any authorized address of the contract.
  • Any authorized address can specify a reward distribution in either BNB or any approved BEP-20 token which will be split among stakers when claiming rewards.
  • There is no check to ensure that a user is going to receive the appropriate amount of rewards that is due to them. If there are no BNB or reward tokens present in the contract at the time a user is claiming, the user will not receive their staking rewards.
  • The contract utilizes a timelock which is set by the owner after a new Distribution is created. In order for users to unstake their tokens, the timelock period, which is a specified amount of time set by the owner when creating a distribution, must have passed.
  • The owner has the ability to pause the contract at any time. When paused, all users are prohibited from staking or withdrawing any tokens.
  • Also, when the contract is paused the owner has the ability to send any amount of BNB as well as all tokens (including the staking token) that are stored in the contract address to any specified address.
  • The owner has the ability to update the staking token of the contract. The team must exercise caution as to not to assign any fee-on-transfer as the staking token, or to ensure that the staking contract is excluded from the token contract's fee mechanism.
  • There is no fee associated with making a deposit to or withdrawing from the contract.
  • Contract-based wallets are not allowed to use the system.
  • The contract utilizes the SafeMath library to prevent overflows.

  • BNBStorage and AssetStorage Contracts:
  • The BNBStorage and AssetStorage contracts are used to hold BNB and reward tokens that can later be deposited into the staking contract by the team in order to create new reward distributions.
  • The owner and any authorized address can call the distribute() function as long as the timelock period from the previous distribution has elasped. This function will collect 20% of the BNB and each reward token that is stored in the contract and send it to a wallet controlled by the team. The remaining 80% will be sent to the staking contract, and a new distribution will be created for both BNB rewards and token rewards.
  • The owner has the ability to pause the BNBStorage contract at any time. When paused, the owner can send any amount of BNB in the contract to any specified address.
  • When the AssetStorage contract is not paused, the owner has the ability to send any amount of any token in the contract to any specified address.
  • The owner can update the Staking contract address to any address at any time.
  • The owner can update the team's wallet to any address at any time.
  • The owner can update the free period and the buffer period of the contract to any values as long as the free period is greater than or equal to the buffer period. Any modification of these values will essentially increase or decrease the timelock period.


  • CryptoDropLoto Contracts:
  • A user can call the placeBet() function to enter into the lottery game. Upon entering, the user will input an amount of BNB as well as a 22 byte input parameter.
  • The first 16 bytes of the input data entered in by the user will be stored as the user's unique lottery ticket number. The remaining 6 bytes are used for the guesses values in the lottery game.
  • The amount of BNB that the user enters must be at least 0.1 BNB and this contribution gets split into four parts.
  • 30% of the BNB is added to the JackpotAmount. 30% of the BNB is sent to the BNBStorage contract. 10% is sent to a wallet controlled by the team. The final 10% is allocated towards purchasing LINK tokens to support the verifiably random functionality of the contract.
  • After placing a bet, a call to Chainlink's VRF service will be made.
  • When Chainlink's VRF service returns the random number a few blocks later, it will be used to determine if the player has won or not within that same call.
  • In order to win, user's must match their guessed to the winning values returned by the Chainlink call.
  • As an additional protection against abuse, only one user may win the game in each block.

  • A second lottery game exists which enforces the same logic as above for every aspect, however instead of entering in BNB, users can input an amount of various BEP20 tokens that have been pre-approved by the team.
  • The minimum and maximum bet amounts of each token are pre-determined by the team.
  • The winner of the token-based lottery game will receive their rewards in the same BEP20 token as they entered in.

  • The owner has the ability to update the team's wallet as well as the BNBStorage address to any address at any time.
  • The owner has the ability to pause the CryptoDropLoto contract at any time. When paused, the owner can send any amount of BNB in the contract to any specified address.
  • When the CryptoDropLoto contract is not paused, the owner has the ability to send any amount of any token in the contract to any specified address.
Audit Findings Summary
  • The source of pseudo-randomness could allow miners/flashbots to only conduct winning transactions; though the team can pause usage of the contract if abuse is detected.
  • Please ensure trust in the team as they can withdraw all of the BNB or BEP20 tokens from the contracts at any time.
  • Date: October 7th, 2021
  • Update Date: October 22nd, 2021 - Review of renewed implementation of the lottery leveraging Chainlink.
  • Update Date: December 4th, 2021 - Improvements to protections against MEV.

Audit Results

Vulnerability CategoryNotesResult
Arbitrary Storage WriteN/APASS
Arbitrary JumpN/APASS
Delegate Call to Untrusted ContractN/APASS
Dependence on Predictable VariablesN/APASS
Deprecated OpcodesN/APASS
Ether ThiefN/APASS
ExceptionsN/APASS
External CallsN/APASS
Integer Over/UnderflowN/APASS
Multiple SendsN/APASS
SuicideN/APASS
State Change External CallsN/APASS
Unchecked RetvalN/APASS
User Supplied AssertionN/APASS
Critical Solidity CompilerN/APASS
Overall Contract Safety PASS

Details: CryptoDrop Staking Contracts


ERC20 Token Graph

Multi-file Token


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public

 + [Int] IERC20 
    - [Ext] totalSupply
    - [Ext] balanceOf
    - [Ext] transfer #
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] transferFrom #

 + [Int] IERC20Metadata (IERC20)
    - [Ext] name
    - [Ext] symbol
    - [Ext] decimals

 +  Context 
    - [Int] _msgSender
    - [Int] _msgData

 +  ERC20 (Context, IERC20, IERC20Metadata)
    - [Pub]  #
    - [Pub] name
    - [Pub] symbol
    - [Pub] decimals
    - [Pub] totalSupply
    - [Pub] balanceOf
    - [Pub] transfer #
    - [Pub] allowance
    - [Pub] approve #
    - [Pub] transferFrom #
    - [Pub] increaseAllowance #
    - [Pub] decreaseAllowance #
    - [Int] _transfer #
    - [Int] _mint #
    - [Int] _burn #
    - [Int] _approve #
    - [Int] _beforeTokenTransfer #
    - [Int] _afterTokenTransfer #

 +  Ownable (Context)
    - [Pub]  #
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Prv] _setOwner #

 + [Lib] Address 
    - [Int] isContract
    - [Int] sendValue #
    - [Int] functionCall #
    - [Int] functionCall #
    - [Int] functionCallWithValue #
    - [Int] functionCallWithValue #
    - [Int] functionStaticCall
    - [Int] functionStaticCall
    - [Int] functionDelegateCall #
    - [Int] functionDelegateCall #
    - [Int] verifyCallResult

 + [Lib] SafeERC20 
    - [Int] safeTransfer #
    - [Int] safeTransferFrom #
    - [Int] safeApprove #
    - [Int] safeIncreaseAllowance #
    - [Int] safeDecreaseAllowance #
    - [Prv] _callOptionalReturn #

 +  ReentrancyGuard 
    - [Pub]  #

 +  Pausable (Context)
    - [Pub]  #
    - [Pub] paused
    - [Int] _pause #
       - modifiers: whenNotPaused
    - [Int] _unpause #
       - modifiers: whenPaused

 +  CryptoDropStaking (ERC20, Ownable, ReentrancyGuard, Pausable)
    - [Pub]  #
       - modifiers: ERC20
    - [Ext] enter #
       - modifiers: nonReentrant,whenNotPaused
    - [Ext] leave #
       - modifiers: nonReentrant,whenNotPaused
    - [Ext] createDistribution ($)
       - modifiers: isAuthorized,whenNotPaused
    - [Ext] claim #
       - modifiers: nonReentrant,whenNotPaused
    - [Pub] transfer #
    - [Pub] transferFrom #
    - [Pub] getDistributionShareBalance
    - [Ext] getRewardsAmount
    - [Ext] getStakingAmount
    - [Ext] authorize #
       - modifiers: isOnlyOwnerOrAuthorized
    - [Ext] updateTokenAddress #
       - modifiers: onlyOwner
    - [Ext] updateTimelockPeriod #
       - modifiers: onlyOwner
    - [Pub] withdrawToken #
       - modifiers: onlyOwner,whenPaused
    - [Pub] withdraw #
       - modifiers: onlyOwner,whenPaused
    - [Ext] pause #
       - modifiers: onlyOwner
    - [Ext] unpause #
       - modifiers: onlyOwner
    - [Ext] updateTimelock #
       - modifiers: onlyOwner
    - [Int] _claim #
    - [Int] _beforeClaim #
    - [Int] _afterClaim #
    - [Int] _getRewardAmount
    - [Int] _deliverFunds #
    - [Int] _updateTimelock #
    - [Int] _updateShares #

 +  CryptoDropStakingV2 (CryptoDropStaking)
    - [Pub]  #
       - modifiers: CryptoDropStaking
    - [Ext] rewardTokens
    - [Ext] createDistributionWithToken #
       - modifiers: isAuthorized,whenNotPaused
    - [Ext] setRewards #
       - modifiers: onlyOwner
    - [Ext] setRewardsWithToken #
       - modifiers: onlyOwner
    - [Ext] getRewardsAmountWithToken
    - [Int] _getRewardAmountWithToken
    - [Int] _beforeClaim #
    - [Pub] withdrawToken #
       - modifiers: onlyOwner,whenPaused
    - [Int] _deliverTokens #
  
							

Details: BNBStorage and AssetStorage Contracts


ERC20 Token Graph

Multi-file Token


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public

 +  Context 
    - [Int] _msgSender
    - [Int] _msgData

 +  Ownable (Context)
    - [Pub]  #
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Prv] _setOwner #

 + [Int] IERC20 
    - [Ext] totalSupply
    - [Ext] balanceOf
    - [Ext] transfer #
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] transferFrom #

 + [Lib] Address 
    - [Int] isContract
    - [Int] sendValue #
    - [Int] functionCall #
    - [Int] functionCall #
    - [Int] functionCallWithValue #
    - [Int] functionCallWithValue #
    - [Int] functionStaticCall
    - [Int] functionStaticCall
    - [Int] functionDelegateCall #
    - [Int] functionDelegateCall #
    - [Int] verifyCallResult

 + [Lib] SafeERC20 
    - [Int] safeTransfer #
    - [Int] safeTransferFrom #
    - [Int] safeApprove #
    - [Int] safeIncreaseAllowance #
    - [Int] safeDecreaseAllowance #
    - [Prv] _callOptionalReturn #

 +  Pausable (Context)
    - [Pub]  #
    - [Pub] paused
    - [Int] _pause #
       - modifiers: whenNotPaused
    - [Int] _unpause #
       - modifiers: whenPaused

 + [Int] ICryptoDropStaking 
    - [Ext] timelock

 +  BNBStorage (Ownable, Pausable)
    - [Pub]  #
    - [Ext] authorize #
       - modifiers: isOnlyOwnerOrAuthorized
    - [Ext]  ($)
    - [Ext] distribute #
       - modifiers: isOnlyOwnerOrAuthorized,whenNotPaused
    - [Int] _beforeDistribute #
    - [Int] _afterDistribute #
    - [Int] _distribute #
    - [Ext] updateStakingContract #
       - modifiers: onlyOwner
    - [Ext] updateFreePeriod #
       - modifiers: onlyOwner
    - [Ext] updateBufferPeriod #
       - modifiers: onlyOwner
    - [Ext] updateWalletAddress #
       - modifiers: onlyOwner
    - [Pub] withdrawToken #
       - modifiers: onlyOwner
    - [Pub] withdraw #
       - modifiers: onlyOwner,whenPaused
    - [Ext] pause #
       - modifiers: onlyOwner
    - [Ext] unpause #
       - modifiers: onlyOwner
    - [Int] _deliverFunds #

 + [Int] ICryptoDropStakingV2 
    - [Ext] timelock
    - [Ext] createDistributionWithToken #
    - [Ext] rewardTokens
    - [Ext] rewardsWithToken

 +  AssetStorage (BNBStorage)
    - [Pub]  #
       - modifiers: BNBStorage
    - [Int] _afterDistribute #
    - [Pub] withdrawToken #
       - modifiers: onlyOwner,whenPaused
    - [Int] _deliverTokens #
  
							

Details: CryptoDrop Lottery Contract


ERC20 Token Graph

Multi-file Token


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public

 + [Int] IERC20 
    - [Ext] totalSupply
    - [Ext] balanceOf
    - [Ext] transfer #
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] transferFrom #

 +  Context 
    - [Int] _msgSender
    - [Int] _msgData

 +  Ownable (Context)
    - [Pub]  #
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Prv] _setOwner #

 + [Lib] Address 
    - [Int] isContract
    - [Int] sendValue #
    - [Int] functionCall #
    - [Int] functionCall #
    - [Int] functionCallWithValue #
    - [Int] functionCallWithValue #
    - [Int] functionStaticCall
    - [Int] functionStaticCall
    - [Int] functionDelegateCall #
    - [Int] functionDelegateCall #
    - [Int] verifyCallResult

 + [Lib] SafeERC20 
    - [Int] safeTransfer #
    - [Int] safeTransferFrom #
    - [Int] safeApprove #
    - [Int] safeIncreaseAllowance #
    - [Int] safeDecreaseAllowance #
    - [Prv] _callOptionalReturn #

 +  ReentrancyGuard 
    - [Pub]  #

 +  Pausable (Context)
    - [Pub]  #
    - [Pub] paused
    - [Int] _pause #
       - modifiers: whenNotPaused
    - [Int] _unpause #
       - modifiers: whenPaused

 + [Lib] Strings 
    - [Int] toString
    - [Int] toHexString
    - [Int] toHexString

 +  CryptoDropLoto (Ownable, ReentrancyGuard, Pausable)
    - [Pub]  #
    - [Ext]  ($)
    - [Ext] placeBet ($)
       - modifiers: nonReentrant,whenNotPaused
    - [Ext] setBetLimits #
       - modifiers: onlyOwner
    - [Ext] activatePromoPeriod #
       - modifiers: onlyOwner,whenNotPaused
    - [Ext] updatePromoPeriod #
       - modifiers: onlyOwner
    - [Ext] updateStorageAddress #
       - modifiers: onlyOwner
    - [Ext] updateTeamAddress #
       - modifiers: onlyOwner
    - [Pub] withdrawToken #
       - modifiers: onlyOwner
    - [Pub] withdrawSomeToken #
       - modifiers: onlyOwner
    - [Pub] withdraw #
       - modifiers: onlyOwner,whenPaused
    - [Pub] withdrawSome #
       - modifiers: onlyOwner,whenPaused
    - [Ext] pause #
       - modifiers: onlyOwner
    - [Ext] unpause #
       - modifiers: onlyOwner
    - [Ext] isActivePromo
    - [Int] _beforeProcessBet #
    - [Int] _processBet #
    - [Int] _getBlockHash
    - [Int] _winMatches
    - [Int] _deliverFunds #
    - [Int] _withdraw #
    - [Int] _withdrawToken #
    - [Int] _afterWithdrawToken #

Details: CryptoDrop Lottery V2 Contract


ERC20 Token Graph

Multi-file Token


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public

 + [Int] IERC20 
    - [Ext] totalSupply
    - [Ext] balanceOf
    - [Ext] transfer #
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] transferFrom #

 +  Context 
    - [Int] _msgSender
    - [Int] _msgData

 +  Ownable (Context)
    - [Pub]  #
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Prv] _setOwner #

 + [Lib] Address 
    - [Int] isContract
    - [Int] sendValue #
    - [Int] functionCall #
    - [Int] functionCall #
    - [Int] functionCallWithValue #
    - [Int] functionCallWithValue #
    - [Int] functionStaticCall
    - [Int] functionStaticCall
    - [Int] functionDelegateCall #
    - [Int] functionDelegateCall #
    - [Int] verifyCallResult

 + [Lib] SafeERC20 
    - [Int] safeTransfer #
    - [Int] safeTransferFrom #
    - [Int] safeApprove #
    - [Int] safeIncreaseAllowance #
    - [Int] safeDecreaseAllowance #
    - [Prv] _callOptionalReturn #

 +  ReentrancyGuard 
    - [Pub]  #

 +  Pausable (Context)
    - [Pub]  #
    - [Pub] paused
    - [Int] _pause #
       - modifiers: whenNotPaused
    - [Int] _unpause #
       - modifiers: whenPaused

 + [Lib] Strings 
    - [Int] toString
    - [Int] toHexString
    - [Int] toHexString

 +  CryptoDropLoto (Ownable, ReentrancyGuard, Pausable)
    - [Pub]  #
    - [Ext]  ($)
    - [Ext] placeBet ($)
       - modifiers: nonReentrant,whenNotPaused
    - [Ext] setBetLimits #
       - modifiers: onlyOwner
    - [Ext] activatePromoPeriod #
       - modifiers: onlyOwner,whenNotPaused
    - [Ext] updatePromoPeriod #
       - modifiers: onlyOwner
    - [Ext] updateStorageAddress #
       - modifiers: onlyOwner
    - [Ext] updateTeamAddress #
       - modifiers: onlyOwner
    - [Pub] withdrawToken #
       - modifiers: onlyOwner
    - [Pub] withdrawSomeToken #
       - modifiers: onlyOwner
    - [Pub] withdraw #
       - modifiers: onlyOwner,whenPaused
    - [Pub] withdrawSome #
       - modifiers: onlyOwner,whenPaused
    - [Ext] pause #
       - modifiers: onlyOwner
    - [Ext] unpause #
       - modifiers: onlyOwner
    - [Ext] isActivePromo
    - [Int] _beforeProcessBet #
    - [Int] _processBet #
    - [Int] _getBlockHash
    - [Int] _winMatches
    - [Int] _deliverFunds #
    - [Int] _withdraw #
    - [Int] _withdrawToken #
    - [Int] _afterWithdrawToken #

 +  CryptoDropLotoV2 (CryptoDropLoto)
    - [Pub]  #
       - modifiers: CryptoDropLoto
    - [Ext] addPartnershipToken #
       - modifiers: onlyOwner
    - [Ext] setPartnershipJackpot #
       - modifiers: onlyOwner
    - [Ext] setBetLimitsWithToken #
       - modifiers: onlyOwner
    - [Ext] placeBetWithToken #
       - modifiers: nonReentrant,whenNotPaused
    - [Int] _beforeProcessBetWithToken #
    - [Int] _processBetWithToken #
    - [Pub] withdrawSomeToken #
       - modifiers: onlyOwner
    - [Int] _afterWithdrawToken #
    - [Int] _deliverTokens #
						
							

Details: CryptoDrop Lottery V3 Contract


ERC20 Token Graph

Multi-file Token


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public

 + [Int] IERC20 
    - [Ext] totalSupply
    - [Ext] balanceOf
    - [Ext] transfer #
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] transferFrom #

 +  Context 
    - [Int] _msgSender
    - [Int] _msgData

 +  Ownable (Context)
    - [Pub]  #
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Prv] _setOwner #

 + [Lib] Address 
    - [Int] isContract
    - [Int] sendValue #
    - [Int] functionCall #
    - [Int] functionCall #
    - [Int] functionCallWithValue #
    - [Int] functionCallWithValue #
    - [Int] functionStaticCall
    - [Int] functionStaticCall
    - [Int] functionDelegateCall #
    - [Int] functionDelegateCall #
    - [Int] verifyCallResult

 + [Lib] SafeERC20 
    - [Int] safeTransfer #
    - [Int] safeTransferFrom #
    - [Int] safeApprove #
    - [Int] safeIncreaseAllowance #
    - [Int] safeDecreaseAllowance #
    - [Prv] _callOptionalReturn #

 +  ReentrancyGuard 
    - [Pub]  #

 +  Pausable (Context)
    - [Pub]  #
    - [Pub] paused
    - [Int] _pause #
       - modifiers: whenNotPaused
    - [Int] _unpause #
       - modifiers: whenPaused

 + [Lib] Strings 
    - [Int] toString
    - [Int] toHexString
    - [Int] toHexString

 +  CryptoDropLoto (Ownable, ReentrancyGuard, Pausable)
    - [Pub]  #
    - [Ext]  ($)
    - [Ext] placeBet ($)
       - modifiers: nonReentrant,whenNotPaused
    - [Ext] setBetLimits #
       - modifiers: onlyOwner
    - [Ext] activatePromoPeriod #
       - modifiers: onlyOwner,whenNotPaused
    - [Ext] updatePromoPeriod #
       - modifiers: onlyOwner
    - [Ext] updateStorageAddress #
       - modifiers: onlyOwner
    - [Ext] updateTeamAddress #
       - modifiers: onlyOwner
    - [Pub] withdrawToken #
       - modifiers: onlyOwner
    - [Pub] withdrawSomeToken #
       - modifiers: onlyOwner
    - [Pub] withdraw #
       - modifiers: onlyOwner,whenPaused
    - [Pub] withdrawSome #
       - modifiers: onlyOwner,whenPaused
    - [Ext] pause #
       - modifiers: onlyOwner
    - [Ext] unpause #
       - modifiers: onlyOwner
    - [Ext] isActivePromo
    - [Int] _beforeProcessBet #
    - [Int] _processBet #
    - [Int] _getBlockHash
    - [Int] _winMatches
    - [Int] _deliverFunds #
    - [Int] _withdraw #
    - [Int] _withdrawToken #
    - [Int] _afterWithdrawToken #

 +  CryptoDropLotoV2 (CryptoDropLoto)
    - [Pub]  #
       - modifiers: CryptoDropLoto
    - [Ext] addPartnershipToken #
       - modifiers: onlyOwner
    - [Ext] setPartnershipJackpot #
       - modifiers: onlyOwner
    - [Ext] setBetLimitsWithToken #
       - modifiers: onlyOwner
    - [Ext] placeBetWithToken #
       - modifiers: nonReentrant,whenNotPaused
    - [Int] _beforeProcessBetWithToken #
    - [Int] _processBetWithToken #
    - [Pub] withdrawSomeToken #
       - modifiers: onlyOwner
    - [Int] _afterWithdrawToken #
    - [Int] _deliverTokens #

 + [Int] LinkTokenInterface 
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] balanceOf
    - [Ext] decimals
    - [Ext] decreaseApproval #
    - [Ext] increaseApproval #
    - [Ext] name
    - [Ext] symbol
    - [Ext] totalSupply
    - [Ext] transfer #
    - [Ext] transferAndCall #
    - [Ext] transferFrom #

 +  VRFRequestIDBase 
    - [Int] makeVRFInputSeed
    - [Int] makeRequestId

 +  VRFConsumerBase (VRFRequestIDBase)
    - [Int] fulfillRandomness #
    - [Int] requestRandomness #
    - [Pub]  #
    - [Ext] rawFulfillRandomness #

 +  CryptoDropLotoV3 (CryptoDropLotoV2, VRFConsumerBase)
    - [Pub]  #
       - modifiers: VRFConsumerBase,CryptoDropLotoV2
    - [Int] _beforeProcessBet #
    - [Int] _processBet #
    - [Int] _processBetWithToken #
    - [Int] fulfillRandomness #
    - [Int] _processBetWithRandomness #
    - [Int] _processBetWithRandomnessWithToken #
    - [Ext] updateLinkFee #
       - modifiers: onlyOwner
    - [Ext] updateKeyHash #
       - modifiers: onlyOwner
    - [Ext] updatePegService #
       - modifiers: onlyOwner
    - [Ext] updateOriginLink #
       - modifiers: onlyOwner