Universe

Smart Contract Audit Report

Audit Summary

UniverseMoney Audit Report Universe is releasing a new ERC20 token that users can use to mint NFTs to earn rewards over time.


For this audit, we reviewed the following contracts on the Avalanche Mainnet:

Audit Findings

Please ensure trust in the team prior to investing as they have substantial control in the ecosystem.
Date: February 24th, 2022.

Contracts Overview

  • The contracts utilize ReentrancyGuard to prevent against reentrancy attacks in applicable functions.
  • As the contracts are implemented with Solidity v0.8.X, they are safe from any possible overflows/underflows.
Universe Contract:
  • This is the base token of the Univ.money platform and can be used to earn additional Universe tokens as rewards by creating Planets.
  • The current total supply of Universe tokens is 12,318,222,742.
  • 24.98% of the total supply is held in JoeSwap UNIV-DAI liquidity.
  • 19.05% of the total supply is held in JoeSwap UNIV-MIM liquidity.
  • 2.35% of the total supply is held in a user's wallet.
  • 1.62% of the total supply is held in another user's wallet.
  • Users may burn their tokens at any time; they may also reduce the circulating supply by sending tokens to the 0x..dead address, if desired.
  • The following wallet restrictions are controlled by the WalletObserverUpgradeable contract.
  • Non-excluded addressed may only send and receive a maximum number of tokens per time frame.
  • The time frame defaults to every 4 hours.
  • The transfers in to a wallet defaults to 100 million tokens per time frame whereas the transfers out of a wallet defaults to 10 million tokens per time frame.
  • Each address may only hold a maximum amount of tokens based on a percentage of the total supply. As this percentage is not set during deployment, the team must ensure to set this variable or users will be unable to receive any tokens.
  • After performing a sell, addresses may only transfer tokens after a 10 block cooldown has passed.
  • Users may not buy, sell, or add liquidity with less than 100,000 tokens at a time.
  • Blacklisted users may not send or receive tokens.
  • The following swap and liquidy functionality is controlled by the LiquidityPoolManager contract.
  • During transfers that are not buys, sells, or liquidity adds/removes, a swap and liquify is performed under the following conditions:
    • The amount of Universe tokens in the contract has reached a swap threshold.
    • Swap and liquify functionality is enabled.
    • The Joeswap Pair has a non-zero supply.
  • Liquidity-adds are automatically performed by selling the Universe tokens collected as fees, pairing the received tokens with the Universe tokens, and adding them as liquidity to the pair.
  • The LP tokens received through this process are sent to various fee addresses.
  • The Treasury, Dev, and Marketing addresses each receive 30% of the LP tokens. The remaining 10% is sent to the Donations address.
  • The owner may withdraw all of the AVAX and tokens in the contract at any time.
  • The owner may update the LiquidityPoolManager and WalletObserverUpgradeable addresses at any time.
  • The owner may update the fee addresses and the percentage of fees they receive at any time.
  • The owner may update the swap and liquify threshold at any time.
  • The owner may toggle the swap and liquify functionality at any time.
  • The owner may toggle between no allowance and maximum allowance for the Contract's designated router at any time.
  • The owner may add and remove any address from the excluded list and blacklist at any time.
  • The owner may reset the number of bought tokens for an account at any time.
  • The owner may update the length of each timeframe as well as the amount of tokens that may move in and out of a wallet during the time frame to any non-zero value at any time.
  • The owner may update the wallet limit to any non-zero value at any time.
PlanetsManagerUpgradeable Contract:
  • Any user may use this contract to create a Planet NFT by burning Universe tokens.
  • A minimum of 100,000 Universe tokens are required to mint a Planet NFT.
  • The number of tokens used to mint the Planet is equal to the Planet's "value".
  • Users specify a name for their Planet when minting; users may rename their planet after minting for a fee of 1% of the Planet's value.
  • NFT metadata that contains information about the NFTs is stored using an off-chain URI endpoint.
  • Users may burn any Planet they own. This will not calculate rewards and will set the Planet as non-existant.
  • Users may merge a collection of Planets they own, as long as as long as one day has passed since the last time each Planet was processed.
  • Merging Planets together will accumulate the total value of all the Planets; users are minted the new total value, after a 2% fee, as rewards after merging.
  • The newly merged Planet will have the lowest reward multiplier of all of the merged planets.
  • The Planets being merged are burned in the process.
  • Users may "compound" a Planet, as long as one day has passed since the last time the Planet was processed.
  • Users also have the option to compound all of their Planets at once.
  • Cashout rewards are dependent on the following factors:
    • The elapsed time since the Planet was last processed.
    • The Planet's level.
    • The Planet's reward multiplier.
    • The Planet's value.
  • The compounded rewards are added to a Planet's value.
  • An additional 5% of the total compounded rewards is minted to the LiquidityPoolManagerUpgradeable contract to be used in liquidity adds.
  • A Planet's reward multiplier is also increased each time the Planet is compounded.
  • Reward multipliers vary from level 0 to level 5. Each reward multiplier level has its own multiplier increase and reward rate.
  • When a Planet is compounded, its reward multiplier is increased by its current level's multiplier increase.
  • A Planet has reached the next tier when its reward multiplier is greater than the threshold for that tier.
  • Users may "cashout" a Planet, as long as the one day has passed since the last time the Planet was processed.
  • Users also have the option to cashout all of their Planets at once.
  • Cashout rewards are dependent on the following factors:
    • The elapsed time since the Planet was last processed.
    • The Planet's level.
    • The Planet's reward multiplier.
    • The Planet's value.
  • The calculated rewards value is minted to the user in the form of Universe tokens.
  • An additional 5% of the total rewards is minted to the LiquidityPoolManagerUpgradeable contract to be used in liquidity adds.
  • A Planet's reward multiplier is reset to level 0 after rewards are cashed out.
  • The owner may pause the contract, disabling all functionality, at any time.
  • The owner may change the tier levels at any time.
  • The owner may change the minimum price to mint a Planet at any time.
  • The owner may withdraw all of the AVAX and tokens in the contract at any time.
  • The owner may update the LiquidityPool manager and Universe token addresses at any time.

Audit Results

Vulnerability CategoryNotesResult
Arbitrary Jump/Storage WriteN/APASS
Centralization of Control
  • The owner may pause the PlanetManagerUpgradeable contract disabling all functionality.
  • The owner may withdraw all AVAX and tokens from the LiquidityPoolManager contract.
  • The owner may add any address to the WalletObserverUpgradeable blacklist preventing token transfers.
  • The owner may update the implementation of contracts changing the logic of functions.
WARNING
Compiler IssuesN/APASS
Delegate Call to Untrusted ContractN/APASS
Dependence on Predictable VariablesN/APASS
Ether/Token TheftN/APASS
Flash LoansN/APASS
Front RunningN/APASS
Improper EventsN/APASS
Improper Authorization SchemeN/APASS
Integer Over/UnderflowN/APASS
Logical IssuesN/APASS
Oracle IssuesN/APASS
Outdated Compiler VersionN/APASS
Race ConditionsN/APASS
ReentrancyN/APASS
Signature IssuesN/APASS
Unbounded LoopsN/APASS
Unused CodeN/APASS
Overall Contract Safety PASS

LiquidityPoolManager Contract

Smart Contract Audit - Inheritance

Smart Contract Audit - Graph


 ($) = 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 #

 + [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 #

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

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

 + [Int] IJoeRouter01 
    - [Ext] factory
    - [Ext] WAVAX
    - [Ext] addLiquidity #
    - [Ext] addLiquidityAVAX ($)
    - [Ext] removeLiquidity #
    - [Ext] removeLiquidityAVAX #
    - [Ext] removeLiquidityWithPermit #
    - [Ext] removeLiquidityAVAXWithPermit #
    - [Ext] swapExactTokensForTokens #
    - [Ext] swapTokensForExactTokens #
    - [Ext] swapExactAVAXForTokens ($)
    - [Ext] swapTokensForExactAVAX #
    - [Ext] swapExactTokensForAVAX #
    - [Ext] swapAVAXForExactTokens ($)
    - [Ext] quote
    - [Ext] getAmountOut
    - [Ext] getAmountIn
    - [Ext] getAmountsOut
    - [Ext] getAmountsIn

 + [Int] IJoeRouter02 (IJoeRouter01)
    - [Ext] removeLiquidityAVAXSupportingFeeOnTransferTokens #
    - [Ext] removeLiquidityAVAXWithPermitSupportingFeeOnTransferTokens #
    - [Ext] swapExactTokensForTokensSupportingFeeOnTransferTokens #
    - [Ext] swapExactAVAXForTokensSupportingFeeOnTransferTokens ($)
    - [Ext] swapExactTokensForAVAXSupportingFeeOnTransferTokens #

 + [Int] IJoeFactory 
    - [Ext] feeTo
    - [Ext] feeToSetter
    - [Ext] migrator
    - [Ext] getPair
    - [Ext] allPairs
    - [Ext] allPairsLength
    - [Ext] createPair #
    - [Ext] setFeeTo #
    - [Ext] setFeeToSetter #
    - [Ext] setMigrator #

 + [Int] IJoePair 
    - [Ext] name
    - [Ext] symbol
    - [Ext] decimals
    - [Ext] totalSupply
    - [Ext] balanceOf
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] transfer #
    - [Ext] transferFrom #
    - [Ext] DOMAIN_SEPARATOR
    - [Ext] PERMIT_TYPEHASH
    - [Ext] nonces
    - [Ext] permit #
    - [Ext] MINIMUM_LIQUIDITY
    - [Ext] factory
    - [Ext] token0
    - [Ext] token1
    - [Ext] getReserves
    - [Ext] price0CumulativeLast
    - [Ext] price1CumulativeLast
    - [Ext] kLast
    - [Ext] mint #
    - [Ext] burn #
    - [Ext] swap #
    - [Ext] skim #
    - [Ext] sync #
    - [Ext] initialize #

 + [Int] ILiquidityPoolManager 
    - [Ext] owner
    - [Ext] getRouter
    - [Ext] getPair
    - [Ext] getLeftSide
    - [Ext] getRightSide
    - [Ext] isPair
    - [Ext] isRouter
    - [Ext] isFeeReceiver
    - [Ext] isLiquidityIntact
    - [Ext] isLiquidityAdded
    - [Ext] afterTokenTransfer #

 +  OwnerRecovery (Ownable)
    - [Ext] recoverLostAVAX #
       - modifiers: onlyOwner
    - [Ext] recoverLostTokens #
       - modifiers: onlyOwner

 + [Int] IUniverse (IERC20)
    - [Ext] owner
    - [Ext] accountBurn #
    - [Ext] accountReward #
    - [Ext] liquidityReward #

 +  UniverseImplementationPointer (Ownable)
    - [Pub] getUniverseImplementation
    - [Pub] changeUniverseImplementation #
       - modifiers: onlyOwner

 +  LiquidityPoolManager (Ownable, OwnerRecovery, UniverseImplementationPointer)
    - [Pub] Constructor #
    - [Ext] afterTokenTransfer #
       - modifiers: onlyUniverse
    - [Ext] isLiquidityAdded
    - [Ext] isLiquidityRemoved
    - [Prv] swapAndLiquify #
    - [Prv] sendLPTokensTo #
    - [Prv] createPairWith #
    - [Prv] swapLeftSideForRightSide #
    - [Prv] addLiquidityToken #
    - [Ext] getRouter
    - [Ext] getPair
    - [Ext] getLeftSide
    - [Ext] getRightSide
    - [Pub] isPair
    - [Ext] isFeeReceiver
    - [Pub] isRouter
    - [Ext] getFeeAddresses
    - [Ext] getFeePercentages
    - [Pub] setAllowance #
       - modifiers: onlyOwner
    - [Pub] shouldLiquify #
       - modifiers: onlyOwner
    - [Pub] updateSwapTokensToLiquidityThreshold #
       - modifiers: onlyOwner
    - [Pub] feesForwarder #
       - modifiers: onlyOwner

PlanetsManagerUpgradeable Contract

Smart Contract Audit - Inheritance

Smart Contract Audit - Graph


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public
 
 + [Lib] AddressUpgradeable 
    - [Int] isContract
    - [Int] sendValue #
    - [Int] functionCall #
    - [Int] functionCall #
    - [Int] functionCallWithValue #
    - [Int] functionCallWithValue #
    - [Int] functionStaticCall
    - [Int] functionStaticCall
    - [Int] verifyCallResult

 +  Initializable 
    - [Prv] _isConstructor

 +  ContextUpgradeable (Initializable)
    - [Int] __Context_init #
       - modifiers: onlyInitializing
    - [Int] __Context_init_unchained #
       - modifiers: onlyInitializing
    - [Int] _msgSender
    - [Int] _msgData

 +  OwnableUpgradeable (Initializable, ContextUpgradeable)
    - [Int] __Ownable_init #
       - modifiers: onlyInitializing
    - [Int] __Ownable_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Int] _transferOwnership #

 + [Int] IERC165Upgradeable 
    - [Ext] supportsInterface

 + [Int] IERC721Upgradeable (IERC165Upgradeable)
    - [Ext] balanceOf
    - [Ext] ownerOf
    - [Ext] safeTransferFrom #
    - [Ext] transferFrom #
    - [Ext] approve #
    - [Ext] getApproved
    - [Ext] setApprovalForAll #
    - [Ext] isApprovedForAll
    - [Ext] safeTransferFrom #

 + [Int] IERC721ReceiverUpgradeable 
    - [Ext] onERC721Received #

 + [Int] IERC721MetadataUpgradeable (IERC721Upgradeable)
    - [Ext] name
    - [Ext] symbol
    - [Ext] tokenURI

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

 +  ERC165Upgradeable (Initializable, IERC165Upgradeable)
    - [Int] __ERC165_init #
       - modifiers: onlyInitializing
    - [Int] __ERC165_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] supportsInterface

 +  ERC721Upgradeable (Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable)
    - [Int] __ERC721_init #
       - modifiers: onlyInitializing
    - [Int] __ERC721_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] supportsInterface
    - [Pub] balanceOf
    - [Pub] ownerOf
    - [Pub] name
    - [Pub] symbol
    - [Pub] tokenURI
    - [Int] _baseURI
    - [Pub] approve #
    - [Pub] getApproved
    - [Pub] setApprovalForAll #
    - [Pub] isApprovedForAll
    - [Pub] transferFrom #
    - [Pub] safeTransferFrom #
    - [Pub] safeTransferFrom #
    - [Int] _safeTransfer #
    - [Int] _exists
    - [Int] _isApprovedOrOwner
    - [Int] _safeMint #
    - [Int] _safeMint #
    - [Int] _mint #
    - [Int] _burn #
    - [Int] _transfer #
    - [Int] _approve #
    - [Int] _setApprovalForAll #
    - [Prv] _checkOnERC721Received #
    - [Int] _beforeTokenTransfer #
    - [Int] _afterTokenTransfer #

 + [Int] IERC721EnumerableUpgradeable (IERC721Upgradeable)
    - [Ext] totalSupply
    - [Ext] tokenOfOwnerByIndex
    - [Ext] tokenByIndex

 +  ERC721EnumerableUpgradeable (Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable)
    - [Int] __ERC721Enumerable_init #
       - modifiers: onlyInitializing
    - [Int] __ERC721Enumerable_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] supportsInterface
    - [Pub] tokenOfOwnerByIndex
    - [Pub] totalSupply
    - [Pub] tokenByIndex
    - [Int] _beforeTokenTransfer #
    - [Prv] _addTokenToOwnerEnumeration #
    - [Prv] _addTokenToAllTokensEnumeration #
    - [Prv] _removeTokenFromOwnerEnumeration #
    - [Prv] _removeTokenFromAllTokensEnumeration #

 +  ERC721URIStorageUpgradeable (Initializable, ERC721Upgradeable)
    - [Int] __ERC721URIStorage_init #
       - modifiers: onlyInitializing
    - [Int] __ERC721URIStorage_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] tokenURI
    - [Int] _setTokenURI #
    - [Int] _burn #

 +  ReentrancyGuardUpgradeable (Initializable)
    - [Int] __ReentrancyGuard_init #
       - modifiers: onlyInitializing
    - [Int] __ReentrancyGuard_init_unchained #
       - modifiers: onlyInitializing

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

 +  PausableUpgradeable (Initializable, ContextUpgradeable)
    - [Int] __Pausable_init #
       - modifiers: onlyInitializing
    - [Int] __Pausable_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] paused
    - [Int] _pause #
       - modifiers: whenNotPaused
    - [Int] _unpause #
       - modifiers: whenPaused

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

 +  OwnerRecoveryUpgradeable (OwnableUpgradeable)
    - [Ext] recoverLostAVAX #
       - modifiers: onlyOwner
    - [Ext] recoverLostTokens #
       - modifiers: onlyOwner

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

 + [Int] IUniverse (IERC20)
    - [Ext] owner
    - [Ext] accountBurn #
    - [Ext] accountReward #
    - [Ext] liquidityReward #

 +  UniverseImplementationPointerUpgradeable (OwnableUpgradeable)
    - [Pub] getUniverseImplementation
    - [Pub] changeUniverseImplementation #
       - modifiers: onlyOwner

 + [Int] ILiquidityPoolManager 
    - [Ext] owner
    - [Ext] getRouter
    - [Ext] getPair
    - [Ext] getLeftSide
    - [Ext] getRightSide
    - [Ext] isPair
    - [Ext] isRouter
    - [Ext] isFeeReceiver
    - [Ext] isLiquidityIntact
    - [Ext] isLiquidityAdded
    - [Ext] afterTokenTransfer #

 +  LiquidityPoolManagerImplementationPointerUpgradeable (OwnableUpgradeable)
    - [Pub] getLiquidityPoolManagerImplementation
    - [Pub] changeLiquidityPoolManagerImplementation #
       - modifiers: onlyOwner

 +  PlanetsManagerUpgradeable (Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721URIStorageUpgradeable, PausableUpgradeable, OwnableUpgradeable, OwnerRecoveryUpgradeable, ReentrancyGuardUpgradeable, UniverseImplementationPointerUpgradeable, LiquidityPoolManagerImplementationPointerUpgradeable)
    - [Ext] initialize #
       - modifiers: initializer
    - [Pub] tokenURI
    - [Ext] renamePlanet #
       - modifiers: nonReentrant,onlyPlanetOwner,checkPermissions,whenNotPaused,universeSet
    - [Ext] createPlanetWithTokens #
       - modifiers: nonReentrant,whenNotPaused,universeSet
    - [Ext] cashoutReward #
       - modifiers: nonReentrant,onlyPlanetOwner,checkPermissions,whenNotPaused,universeSet
    - [Ext] cashoutAll #
       - modifiers: nonReentrant,onlyPlanetOwner,whenNotPaused,universeSet
    - [Ext] compoundReward #
       - modifiers: nonReentrant,onlyPlanetOwner,checkPermissions,whenNotPaused,universeSet
    - [Ext] compoundAll #
       - modifiers: nonReentrant,onlyPlanetOwner,whenNotPaused,universeSet
    - [Prv] _getPlanetCashoutRewards #
    - [Prv] _getPlanetCompoundRewards #
    - [Prv] _cashoutReward #
    - [Prv] logTier #
    - [Prv] getProcessingFee
    - [Prv] increaseMultiplier
    - [Prv] getCashoutDynamicFee
    - [Prv] isProcessable
    - [Prv] calculateReward
    - [Prv] rewardPerDayFor
    - [Prv] _calculateRewardsFromValue
    - [Prv] planetExists
    - [Ext] calculateTotalDailyEmission
    - [Pub] isNameAvailable
    - [Pub] isOwnerOfPlanets
    - [Pub] isOwnerOfPlanet
    - [Pub] getPlanetIdsOf
    - [Ext] getPlanetsByIds
    - [Pub] changeNodeMinPrice #
       - modifiers: onlyOwner
    - [Pub] changeCompoundDelay #
       - modifiers: onlyOwner
    - [Pub] changeTierSystem #
       - modifiers: onlyOwner
    - [Pub] pause #
       - modifiers: onlyOwner
    - [Pub] unpause #
       - modifiers: onlyOwner
    - [Int] _burn #
    - [Int] _beforeTokenTransfer #
       - modifiers: whenNotPaused
    - [Pub] supportsInterface

Universe 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
    - [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] 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 #

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

 +  OwnerRecovery (Ownable)
    - [Ext] recoverLostAVAX #
       - modifiers: onlyOwner
    - [Ext] recoverLostTokens #
       - modifiers: onlyOwner

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

 + [Int] ILiquidityPoolManager 
    - [Ext] owner
    - [Ext] getRouter
    - [Ext] getPair
    - [Ext] getLeftSide
    - [Ext] getRightSide
    - [Ext] isPair
    - [Ext] isRouter
    - [Ext] isFeeReceiver
    - [Ext] isLiquidityIntact
    - [Ext] isLiquidityAdded
    - [Ext] afterTokenTransfer #

 +  LiquidityPoolManagerImplementationPointer (Ownable)
    - [Pub] getLiquidityPoolManagerImplementation
    - [Pub] changeLiquidityPoolManagerImplementation #
       - modifiers: onlyOwner

 + [Int] IWalletObserver 
    - [Ext] beforeTokenTransfer #

 +  WalletObserverImplementationPointer (Ownable)
    - [Pub] getWalletObserverImplementation
    - [Pub] changeWalletObserverImplementation #
       - modifiers: onlyOwner

 +  Universe (ERC20, ERC20Burnable, Ownable, OwnerRecovery, LiquidityPoolManagerImplementationPointer, WalletObserverImplementationPointer)
    - [Pub] Constructor #
       - modifiers: ERC20
    - [Int] _beforeTokenTransfer #
    - [Int] _afterTokenTransfer #
    - [Ext] accountBurn #
       - modifiers: onlyPlanetsManager
    - [Ext] accountReward #
       - modifiers: onlyPlanetsManager
    - [Ext] liquidityReward #
       - modifiers: onlyPlanetsManager

WalletObserverUpgradeable Contract

Smart Contract Audit - Inheritance

Smart Contract Audit - Graph


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public
 
 + [Int] IJoePair 
    - [Ext] name
    - [Ext] symbol
    - [Ext] decimals
    - [Ext] totalSupply
    - [Ext] balanceOf
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] transfer #
    - [Ext] transferFrom #
    - [Ext] DOMAIN_SEPARATOR
    - [Ext] PERMIT_TYPEHASH
    - [Ext] nonces
    - [Ext] permit #
    - [Ext] MINIMUM_LIQUIDITY
    - [Ext] factory
    - [Ext] token0
    - [Ext] token1
    - [Ext] getReserves
    - [Ext] price0CumulativeLast
    - [Ext] price1CumulativeLast
    - [Ext] kLast
    - [Ext] mint #
    - [Ext] burn #
    - [Ext] swap #
    - [Ext] skim #
    - [Ext] sync #
    - [Ext] initialize #

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

 +  Initializable 
    - [Prv] _isConstructor

 +  ContextUpgradeable (Initializable)
    - [Int] __Context_init #
       - modifiers: onlyInitializing
    - [Int] __Context_init_unchained #
       - modifiers: onlyInitializing
    - [Int] _msgSender
    - [Int] _msgData

 +  OwnableUpgradeable (Initializable, ContextUpgradeable)
    - [Int] __Ownable_init #
       - modifiers: onlyInitializing
    - [Int] __Ownable_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Int] _transferOwnership #

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

 +  OwnerRecoveryUpgradeable (OwnableUpgradeable)
    - [Ext] recoverLostAVAX #
       - modifiers: onlyOwner
    - [Ext] recoverLostTokens #
       - modifiers: onlyOwner

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

 + [Int] IUniverse (IERC20)
    - [Ext] owner
    - [Ext] accountBurn #
    - [Ext] accountReward #
    - [Ext] liquidityReward #

 +  UniverseImplementationPointerUpgradeable (OwnableUpgradeable)
    - [Pub] getUniverseImplementation
    - [Pub] changeUniverseImplementation #
       - modifiers: onlyOwner

 + [Int] ILiquidityPoolManager 
    - [Ext] owner
    - [Ext] getRouter
    - [Ext] getPair
    - [Ext] getLeftSide
    - [Ext] getRightSide
    - [Ext] isPair
    - [Ext] isRouter
    - [Ext] isFeeReceiver
    - [Ext] isLiquidityIntact
    - [Ext] isLiquidityAdded
    - [Ext] afterTokenTransfer #

 +  LiquidityPoolManagerImplementationPointerUpgradeable (OwnableUpgradeable)
    - [Pub] getLiquidityPoolManagerImplementation
    - [Pub] changeLiquidityPoolManagerImplementation #
       - modifiers: onlyOwner

 + [Int] IPlanetsManager 
    - [Ext] owner
    - [Ext] setToken #
    - [Ext] createNode #
    - [Ext] cashoutReward #
    - [Ext] _cashoutAllNodesReward #
    - [Ext] _addNodeValue #
    - [Ext] _addAllNodeValue #
    - [Ext] _getNodeValueOf
    - [Ext] _getNodeValueOf
    - [Ext] _getNodeValueAmountOf
    - [Ext] _getAddValueCountOf
    - [Ext] _getRewardMultOf
    - [Ext] _getRewardMultOf
    - [Ext] _getRewardMultAmountOf
    - [Ext] _getRewardAmountOf
    - [Ext] _getRewardAmountOf
    - [Ext] _getNodeRewardAmountOf
    - [Ext] _getNodesNames
    - [Ext] _getNodesCreationTime
    - [Ext] _getNodesRewardAvailable
    - [Ext] _getNodesLastClaimTime
    - [Ext] _changeNodeMinPrice #
    - [Ext] _changeRewardPerValue #
    - [Ext] _changeClaimTime #
    - [Ext] _changeAutoDistri #
    - [Ext] _changeTierSystem #
    - [Ext] _changeGasDistri #
    - [Ext] _getNodeNumberOf
    - [Ext] _isNodeOwner
    - [Ext] _distributeRewards #
    - [Ext] getNodeMinPrice

 +  PlanetsManagerImplementationPointerUpgradeable (OwnableUpgradeable)
    - [Pub] getPlanetsManagerImplementation
    - [Pub] changePlanetsManagerImplementation #
       - modifiers: onlyOwner

 +  WalletObserverUpgradeable (Initializable, OwnableUpgradeable, OwnerRecoveryUpgradeable, UniverseImplementationPointerUpgradeable, LiquidityPoolManagerImplementationPointerUpgradeable, PlanetsManagerImplementationPointerUpgradeable)
    - [Ext] initialize #
       - modifiers: initializer
    - [Pub] changeUniverseImplementation #
       - modifiers: onlyOwner
    - [Pub] changeLiquidityPoolManagerImplementation #
       - modifiers: onlyOwner
    - [Int] isPair
    - [Ext] beforeTokenTransfer #
       - modifiers: onlyUniverse,checkTimeframe,isNotDenied,isNotDenied,isNotDenied,isNotDenied
    - [Pub] getMaxTokenPerWallet
    - [Ext] getTimeframeExpiresAfter
    - [Ext] getTimeframeCurrent
    - [Prv] getRemainingTransfersOut
    - [Prv] getRemainingTransfersOutWithSellAllowance
    - [Prv] getRemainingTransfersIn
    - [Ext] getOverviewOf
    - [Pub] getBoughtTokensOf
    - [Pub] isWalletFull
    - [Pub] isExcludedFromObserver
    - [Pub] setMaxTokenPerWalletPercent #
       - modifiers: onlyOwner
    - [Pub] setTimeframeExpiresAfter #
       - modifiers: onlyOwner
    - [Pub] setTimeframeQuotaIn #
       - modifiers: onlyOwner
    - [Pub] setTimeframeQuotaOut #
       - modifiers: onlyOwner
    - [Ext] denyMalicious #
       - modifiers: onlyOwner
    - [Ext] _decode_call_771274418637067024507 #
       - modifiers: onlyOwner
    - [Pub] excludeFromObserver #
       - modifiers: onlyOwner