Monopoly Finance

Smart Contract Audit Report

Audit Summary

Monopoly Finance Audit Report Monopoly Finance is releasing a new staking platform where users can earn rewards in their native token with additional rewards from Strategy contracts.

For this audit, we reviewed the project team's MonoMaster, BaseStrategy, StrategyStorage, and StrategyZyber contracts at commit 5f78aa7b5d05c484d98cb17c3bf320d8b862fb53 on the team's GitHub repository.

Audit Findings

No findings were identified, though some centralized aspects are present.
Date: April 5th, 2023.

Contracts Overview

  • As the contracts are implemented with Solidity v0.8, they are safe from any possible overflows/underflows.
  • The team must exercise caution when assigning the staking tokens to avoid using fee-on-transfer tokens and ERC-777 tokens.
MonoMaster Contract:
  • This contract allows Externally Owned Addresses (EOAs) and whitelisted contracts to stake tokens into various Pools to earn rewards in the project's native token.
  • Any address may deposit when the whitelist is not enabled.
  • Each Pool has its own staking token and Strategy contract associated with it.
  • All tokens staked into a Pool will be deposited in the corresponding Strategy.
  • A deposit fee may be taken and transferred to the PerformanceFee address controlled by the team if the Pool has a fee percentage set.
  • Users may optionally specify a referrer address if the EarningReferral fee has been set.
  • The EarningReferral contract is outside the scope of this audit so we are unable to give an assessment in regard to security.
  • Users will receive a reward amount on each block based on the amount staked and the amount of points allocated to the pool.
  • On deposits and withdrawals, any pending rewards for the Pool are calculated and minted to the contract.
  • When a Pool's rewards are updated an additional "dev percentage" of rewards tokens are minted to the Dev address.
  • An additional fee may be taken during withdraws if the Pool has withdrawal fees enabled.
  • The withdrawal fee will decrease over time from the last time the user withdrew from a Pool until reaching the "minimum withdraw fee".
  • Users may harvest their rewards at any time. This will collect the user's rewards from this contract as well as any pending rewards from the Strategy contract.
  • If the harvesting user has supplied a referrer address, the referrer will be minted a "commission amount" of rewards tokens.
  • The user may also trigger an emergency withdraw, which will withdraw all of the user's deposited tokens and forfeit any earned rewards.
  • The owner may add a new Pool at any time.
  • The owner may update a Pool's allocated points, deposit fee, and whether there is a withdraw fee at any time.
  • The owner may migrate a Pool's associated Strategy at any time. This will transfer all deposited tokens to the new Strategy.
  • The owner may update the Strategy for a Pool at any time.
  • The owner may manually mint any amount of rewards tokens to any address at any time.
  • The owner may update the EarningReferral, Dev, and PerformanceFee addresses at any time.
  • The owner may set the Dev rate and rewards rate at any time.
  • The owner may add and remove any address from the whitelist at any time.
  • The owner may toggle whether contracts must be on the whitelist to deposit and withdraw at any time.
  • The owner may withdraw any errant tokens from a Strategy address at any time.
  • The owner may update a Strategy's token allowances at any time.
  • The owner may update a Strategy's performance fee basis points at any time.
  • The owner may update the commission amount percentage at any time.
StrategyZyber Contract:
  • This contract functions as a Strategy for the MonoMaster contract. This means the MonoMaster contract is intended to be the owner of this contract.
  • The owner may deposit a specified "deposit token" to earn rewards on behalf of users.
  • The owner may withdraw tokens on behalf of users. An additional fee may be taken if the Pool associated with this contract has withdrawals enabled.
  • All deposited tokens are deposited into a Staking contract.
  • The Staking contract is outside the scope of this audit so we are unable to give an assessment in regard to security.
  • Users will receive rewards per token staked as the contract accumulates rewards from the Strategy contract.
  • On deposits and withdrawals, any pending rewards are calculated and minted to the user.
  • The owner may withdraw any non-deposit token from the contract at any time.
  • The owner may set the allowance for a specified token at any time.
  • The owner may migrate at any time. This will transfer all deposit and rewards tokens to a new address.
  • The owner may transfer ownership at any time.
  • The owner may set the performance fee at any time.
StrategyStorage Contract:
  • This contract is used to manage users' reward debt in the StrategyZyber contract.
  • The owner may increase and decrease a user's reward debt by a specified amount at any time.
  • The owner may set a user's reward debt to any value at any time.
  • The owner may increase the reward tokens per share at any time.

Audit Results

Vulnerability Category Notes Result
Arbitrary Jump/Storage Write N/A PASS
Centralization of Control
  • The MonoMaster owner may migrate a Pool's Strategy.
  • The MonoMaster owner may mint any amount of rewards tokens.
  • The MonoMaster owner may update the rewards rate to any value.
WARNING
Compiler Issues N/A PASS
Delegate Call to Untrusted Contract N/A PASS
Dependence on Predictable Variables N/A PASS
Ether/Token Theft N/A PASS
Flash Loans N/A PASS
Front Running N/A PASS
Improper Events N/A PASS
Improper Authorization Scheme N/A PASS
Integer Over/Underflow N/A PASS
Logical Issues N/A PASS
Oracle Issues N/A PASS
Outdated Compiler Version N/A PASS
Race Conditions N/A PASS
Reentrancy N/A PASS
Signature Issues N/A PASS
Sybil Attack N/A PASS
Unbounded Loops N/A PASS
Unused Code N/A PASS
Overall Contract Safety   PASS

MonoMaster Contract

Smart Contract Audit - Inheritance

Smart Contract Audit - Graph


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public
 
 +  Context 
    - [Int] _msgSender
    - [Int] _msgData

 +  Ownable (Context)
    - [Pub] Constructor #
    - [Pub] owner
    - [Int] _checkOwner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Int] _transferOwnership #

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

 + [Int] IERC20Permit 
    - [Ext] permit #
    - [Ext] nonces
    - [Ext] DOMAIN_SEPARATOR

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

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

 + [Int] IStrategy 
    - [Ext] deposit #
    - [Ext] withdraw #
    - [Ext] inCaseTokensGetStuck #
    - [Ext] setAllowances #
    - [Ext] revokeAllowance #
    - [Ext] migrate #
    - [Ext] onMigration #
    - [Ext] pendingTokens
    - [Ext] transferOwnership #
    - [Ext] setPerformanceFeeBips #

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

 +  ERC20 (Context, IERC20, IERC20Metadata)
    - [Pub] Constructor #
    - [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] _spendAllowance #
    - [Int] _beforeTokenTransfer #
    - [Int] _afterTokenTransfer #

 + [Lib] Math 
    - [Int] max
    - [Int] min
    - [Int] average
    - [Int] ceilDiv
    - [Int] mulDiv
    - [Int] mulDiv
    - [Int] sqrt
    - [Int] sqrt
    - [Int] log2
    - [Int] log2
    - [Int] log10
    - [Int] log10
    - [Int] log256
    - [Int] log256

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

 + [Lib] ECDSA 
    - [Prv] _throwError
    - [Int] tryRecover
    - [Int] recover
    - [Int] tryRecover
    - [Int] recover
    - [Int] tryRecover
    - [Int] recover
    - [Int] toEthSignedMessageHash
    - [Int] toEthSignedMessageHash
    - [Int] toTypedDataHash

 +  EIP712 
    - [Pub] Constructor #
    - [Int] _domainSeparatorV4
    - [Prv] _buildDomainSeparator
    - [Int] _hashTypedDataV4

 + [Lib] Counters 
    - [Int] current
    - [Int] increment #
    - [Int] decrement #
    - [Int] reset #

 +  ERC20Permit (ERC20, IERC20Permit, EIP712)
    - [Pub] Constructor #
       - modifiers: EIP712
    - [Pub] permit #
    - [Pub] nonces
    - [Ext] DOMAIN_SEPARATOR
    - [Int] _useNonce #

 +  ERC20Burnable (Context, ERC20)
    - [Pub] burn #
    - [Pub] burnFrom #

 + [Int] IAccessControl 
    - [Ext] hasRole
    - [Ext] getRoleAdmin
    - [Ext] grantRole #
    - [Ext] revokeRole #
    - [Ext] renounceRole #

 + [Int] IERC165 
    - [Ext] supportsInterface

 +  ERC165 (IERC165)
    - [Pub] supportsInterface

 +  AccessControl (Context, IAccessControl, ERC165)
    - [Pub] supportsInterface
    - [Pub] hasRole
    - [Int] _checkRole
    - [Int] _checkRole
    - [Pub] getRoleAdmin
    - [Pub] grantRole #
       - modifiers: onlyRole
    - [Pub] revokeRole #
       - modifiers: onlyRole
    - [Pub] renounceRole #
    - [Int] _setupRole #
    - [Int] _setRoleAdmin #
    - [Int] _grantRole #
    - [Int] _revokeRole #

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

 +  MonopolyToken (ERC20Burnable, ERC20Permit, AccessControl, Pausable)
    - [Pub] Constructor #
       - modifiers: ERC20,ERC20Permit
    - [Pub] mint #
       - modifiers: onlyRole
    - [Ext] getMaxTotalSupply
    - [Pub] pause #
       - modifiers: onlyRole
    - [Pub] unpause #
       - modifiers: onlyRole
    - [Int] _beforeTokenTransfer #
       - modifiers: whenNotPaused
    - [Ext] rescueTokens #
       - modifiers: onlyRole

 + [Int] IEarningsReferral 
    - [Ext] recordReferral #
    - [Ext] recordReferralCommission #
    - [Ext] getReferrer

 +  MonoMaster (Ownable)
    - [Pub] Constructor #
    - [Pub] poolLength
    - [Pub] pendingEarnings
    - [Ext] pendingTokens
    - [Pub] reward
    - [Pub] earningPerYear
    - [Pub] earningPerYearToMonopoly
    - [Pub] totalShares
    - [Pub] totalLP
    - [Pub] userShares
    - [Pub] updatePool #
    - [Pub] massUpdatePools #
    - [Ext] deposit #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] withdraw #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] harvest #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] withdrawAndHarvest #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] emergencyWithdraw #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] add #
       - modifiers: onlyOwner
    - [Ext] set #
       - modifiers: onlyOwner
    - [Ext] migrateStrategy #
       - modifiers: onlyOwner
    - [Ext] setStrategy #
       - modifiers: onlyOwner
    - [Ext] manualMint #
       - modifiers: onlyOwner
    - [Ext] setDev #
       - modifiers: onlyOwner
    - [Ext] setPerfomanceFeeAddress #
       - modifiers: onlyOwner
    - [Ext] setDevMintBips #
       - modifiers: onlyOwner
    - [Ext] setEarningsEmission #
       - modifiers: onlyOwner
    - [Ext] modifyApprovedContracts #
       - modifiers: onlyOwner
    - [Ext] setOnlyApprovedContractOrEOAStatus #
       - modifiers: onlyOwner
    - [Ext] inCaseTokensGetStuck #
       - modifiers: onlyOwner
    - [Ext] setAllowances #
       - modifiers: onlyOwner
    - [Ext] revokeAllowance #
       - modifiers: onlyOwner
    - [Ext] setPerformanceFeeBips #
       - modifiers: onlyOwner
    - [Int] safeEarningsTransfer #
    - [Pub] getWithdrawFee
    - [Pub] setWithdrawFee #
       - modifiers: onlyOwner
    - [Pub] setEarningsReferral #
       - modifiers: onlyOwner
    - [Pub] setReferralCommissionRate #
       - modifiers: onlyOwner
    - [Int] payReferralCommission #

StrategyZyber Contract

Smart Contract Audit - Inheritance

Smart Contract Audit - Graph


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public
 
 +  Context 
    - [Int] _msgSender
    - [Int] _msgData

 +  Ownable (Context)
    - [Pub] Constructor #
    - [Pub] owner
    - [Int] _checkOwner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Int] _transferOwnership #

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

 + [Int] IERC20Permit 
    - [Ext] permit #
    - [Ext] nonces
    - [Ext] DOMAIN_SEPARATOR

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

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

 + [Int] IStrategy 
    - [Ext] deposit #
    - [Ext] withdraw #
    - [Ext] inCaseTokensGetStuck #
    - [Ext] setAllowances #
    - [Ext] revokeAllowance #
    - [Ext] migrate #
    - [Ext] onMigration #
    - [Ext] pendingTokens
    - [Ext] transferOwnership #
    - [Ext] setPerformanceFeeBips #

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

 +  Ownable (Context)
    - [Pub] Constructor #
    - [Pub] owner
    - [Int] _checkOwner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Int] _transferOwnership #

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

 + [Int] IERC20Permit 
    - [Ext] permit #
    - [Ext] nonces
    - [Ext] DOMAIN_SEPARATOR

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

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

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

 +  ERC20 (Context, IERC20, IERC20Metadata)
    - [Pub] Constructor #
    - [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] _spendAllowance #
    - [Int] _beforeTokenTransfer #
    - [Int] _afterTokenTransfer #

 + [Lib] Math 
    - [Int] max
    - [Int] min
    - [Int] average
    - [Int] ceilDiv
    - [Int] mulDiv
    - [Int] mulDiv
    - [Int] sqrt
    - [Int] sqrt
    - [Int] log2
    - [Int] log2
    - [Int] log10
    - [Int] log10
    - [Int] log256
    - [Int] log256

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

 + [Lib] ECDSA 
    - [Prv] _throwError
    - [Int] tryRecover
    - [Int] recover
    - [Int] tryRecover
    - [Int] recover
    - [Int] tryRecover
    - [Int] recover
    - [Int] toEthSignedMessageHash
    - [Int] toEthSignedMessageHash
    - [Int] toTypedDataHash

 +  EIP712 
    - [Pub] Constructor #
    - [Int] _domainSeparatorV4
    - [Prv] _buildDomainSeparator
    - [Int] _hashTypedDataV4

 + [Lib] Counters 
    - [Int] current
    - [Int] increment #
    - [Int] decrement #
    - [Int] reset #

 +  ERC20Permit (ERC20, IERC20Permit, EIP712)
    - [Pub] Constructor #
       - modifiers: EIP712
    - [Pub] permit #
    - [Pub] nonces
    - [Ext] DOMAIN_SEPARATOR
    - [Int] _useNonce #

 +  ERC20Burnable (Context, ERC20)
    - [Pub] burn #
    - [Pub] burnFrom #

 + [Int] IAccessControl 
    - [Ext] hasRole
    - [Ext] getRoleAdmin
    - [Ext] grantRole #
    - [Ext] revokeRole #
    - [Ext] renounceRole #

 + [Int] IERC165 
    - [Ext] supportsInterface

 +  ERC165 (IERC165)
    - [Pub] supportsInterface

 +  AccessControl (Context, IAccessControl, ERC165)
    - [Pub] supportsInterface
    - [Pub] hasRole
    - [Int] _checkRole
    - [Int] _checkRole
    - [Pub] getRoleAdmin
    - [Pub] grantRole #
       - modifiers: onlyRole
    - [Pub] revokeRole #
       - modifiers: onlyRole
    - [Pub] renounceRole #
    - [Int] _setupRole #
    - [Int] _setRoleAdmin #
    - [Int] _grantRole #
    - [Int] _revokeRole #

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

 +  MonopolyToken (ERC20Burnable, ERC20Permit, AccessControl, Pausable)
    - [Pub] Constructor #
       - modifiers: ERC20,ERC20Permit
    - [Pub] mint #
       - modifiers: onlyRole
    - [Ext] getMaxTotalSupply
    - [Pub] pause #
       - modifiers: onlyRole
    - [Pub] unpause #
       - modifiers: onlyRole
    - [Int] _beforeTokenTransfer #
       - modifiers: whenNotPaused
    - [Ext] rescueTokens #
       - modifiers: onlyRole

 + [Int] IEarningsReferral 
    - [Ext] recordReferral #
    - [Ext] recordReferralCommission #
    - [Ext] getReferrer

 +  MonoMaster (Ownable)
    - [Pub] Constructor #
    - [Pub] poolLength
    - [Pub] pendingEarnings
    - [Ext] pendingTokens
    - [Pub] reward
    - [Pub] earningPerYear
    - [Pub] earningPerYearToMonopoly
    - [Pub] totalShares
    - [Pub] totalLP
    - [Pub] userShares
    - [Pub] updatePool #
    - [Pub] massUpdatePools #
    - [Ext] deposit #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] withdraw #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] harvest #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] withdrawAndHarvest #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] emergencyWithdraw #
       - modifiers: onlyApprovedContractOrEOA
    - [Ext] add #
       - modifiers: onlyOwner
    - [Ext] set #
       - modifiers: onlyOwner
    - [Ext] migrateStrategy #
       - modifiers: onlyOwner
    - [Ext] setStrategy #
       - modifiers: onlyOwner
    - [Ext] manualMint #
       - modifiers: onlyOwner
    - [Ext] setDev #
       - modifiers: onlyOwner
    - [Ext] setPerfomanceFeeAddress #
       - modifiers: onlyOwner
    - [Ext] setDevMintBips #
       - modifiers: onlyOwner
    - [Ext] setEarningsEmission #
       - modifiers: onlyOwner
    - [Ext] modifyApprovedContracts #
       - modifiers: onlyOwner
    - [Ext] setOnlyApprovedContractOrEOAStatus #
       - modifiers: onlyOwner
    - [Ext] inCaseTokensGetStuck #
       - modifiers: onlyOwner
    - [Ext] setAllowances #
       - modifiers: onlyOwner
    - [Ext] revokeAllowance #
       - modifiers: onlyOwner
    - [Ext] setPerformanceFeeBips #
       - modifiers: onlyOwner
    - [Int] safeEarningsTransfer #
    - [Pub] getWithdrawFee
    - [Pub] setWithdrawFee #
       - modifiers: onlyOwner
    - [Pub] setEarningsReferral #
       - modifiers: onlyOwner
    - [Pub] setReferralCommissionRate #
       - modifiers: onlyOwner
    - [Int] payReferralCommission #

 +  BaseStrategy (IStrategy, Ownable)
    - [Pub] Constructor #
    - [Ext] pendingTokens
    - [Ext] deposit #
       - modifiers: onlyOwner
    - [Ext] withdraw #
       - modifiers: onlyOwner
    - [Ext] inCaseTokensGetStuck #
       - modifiers: onlyOwner
    - [Ext] setAllowances #
       - modifiers: onlyOwner
    - [Ext] revokeAllowance #
       - modifiers: onlyOwner
    - [Ext] migrate #
       - modifiers: onlyOwner
    - [Ext] onMigration #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Ext] setPerformanceFeeBips #
       - modifiers: onlyOwner

 +  StrategyStorage (Ownable)
    - [Ext] increaseRewardDebt #
       - modifiers: onlyOwner
    - [Ext] decreaseRewardDebt #
       - modifiers: onlyOwner
    - [Ext] setRewardDebt #
       - modifiers: onlyOwner
    - [Ext] increaseRewardTokensPerShare #
       - modifiers: onlyOwner

 + [Int] IBoringERC20 
    - [Ext] mint #
    - [Ext] totalSupply
    - [Ext] balanceOf
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] permit #

 + [Int] IMultipleRewards 
    - [Ext] onZyberReward #
    - [Ext] pendingTokens
    - [Ext] rewardToken
    - [Ext] poolRewardsPerSec

 + [Int] IZyberChef 
    - [Ext] deposit #
    - [Ext] withdraw #
    - [Ext] pendingTokens
    - [Ext] userInfo

 +  StrategyZyber (BaseStrategy)
    - [Pub] Constructor #
       - modifiers: BaseStrategy
    - [Pub] checkReward
    - [Pub] pendingRewards
    - [Ext] rewardTokens
    - [Ext] pendingTokens
    - [Ext] harvest #
    - [Ext] deposit #
       - modifiers: onlyOwner
    - [Ext] withdraw #
       - modifiers: onlyOwner
    - [Ext] migrate #
       - modifiers: onlyOwner
    - [Ext] onMigration #
       - modifiers: onlyOwner
    - [Ext] setAllowances #
       - modifiers: onlyOwner
    - [Int] _claimRewards #
    - [Int] _harvest #
    - [Int] _safeRewardTokenTransfer #

StrategyStorage Contract

Smart Contract Audit - Inheritance

Smart Contract Audit - Graph


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public
 
 +  Context 
    - [Int] _msgSender
    - [Int] _msgData

 +  Ownable (Context)
    - [Pub] Constructor #
    - [Pub] owner
    - [Int] _checkOwner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Int] _transferOwnership #

 +  StrategyStorage (Ownable)
    - [Ext] increaseRewardDebt #
       - modifiers: onlyOwner
    - [Ext] decreaseRewardDebt #
       - modifiers: onlyOwner
    - [Ext] setRewardDebt #
       - modifiers: onlyOwner
    - [Ext] increaseRewardTokensPerShare #
       - modifiers: onlyOwner

About SourceHat

SourceHat has quickly grown to have one of the most experienced and well-equipped smart contract auditing teams in the industry. Our team has conducted 1800+ solidity smart contract audits covering all major project types and protocols, securing a total of over $50 billion U.S. dollars in on-chain value!
Our firm is well-reputed in the community and is trusted as a top smart contract auditing company for the review of solidity code, no matter how complex. Our team of experienced solidity smart contract auditors performs audits for tokens, NFTs, crowdsales, marketplaces, gambling games, financial protocols, and more!

Contact us today to get a free quote for a smart contract audit of your project!

What is a SourceHat Audit?

Typically, a smart contract audit is a comprehensive review process designed to discover logical errors, security vulnerabilities, and optimization opportunities within code. A SourceHat Audit takes this a step further by verifying economic logic to ensure the stability of smart contracts and highlighting privileged functionality to create a report that is easy to understand for developers and community members alike.

How Do I Interpret the Findings?

Each of our Findings will be labeled with a Severity level. We always recommend the team resolve High, Medium, and Low severity findings prior to deploying the code to the mainnet. Here is a breakdown on what each Severity level means for the project:

  • High severity indicates that the issue puts a large number of users' funds at risk and has a high probability of exploitation, or the smart contract contains serious logical issues which can prevent the code from operating as intended.
  • Medium severity issues are those which place at least some users' funds at risk and has a medium to high probability of exploitation.
  • Low severity issues have a relatively minor risk association; these issues have a low probability of occurring or may have a minimal impact.
  • Informational issues pose no immediate risk, but inform the project team of opportunities for gas optimizations and following smart contract security best practices.