Odyssey

Smart Contract Audit Report

Audit Summary

Odyssey Audit Report Odyssey is a new token thats pays dividends to users in BNB based on the time since their last sell.

For this audit, we reviewed the contracts folder at commit 893ed0cdf32e5fccc46f02dbbd2bd722053611fa on the team's GitHub repository.

Audit Findings

Please ensure trust in the team prior to investing as they have some control in the ecosystem.
Date: March 25th, 2022.
Updated: March 28th, 2022 to address changes from commit 5ad8a556a629b03602f1efb02becaee273fd3b5d to commit 893ed0cdf32e5fccc46f02dbbd2bd722053611fa.

Finding #1 - OdysseyProject - Medium (Resolved)

Description: The replaceOfficer() function allows the officer being replaced to restart the voting proccess.
Risk/Impact: If one of the officers demonstrates malicious behavior, they could indefinitely delay the voting process to remove them as an officer.
Recommendation: The officer being replaced should not be able to influence the voting process.
Resolution: The team has disallowed an officer from calling the replaceOfficer() function if any of the officers have voted to replace them.

Finding #2 - Odyssey - Low (Resolved)

Description: The openToPublic() function allows for repeated calls.
Risk/Impact: As the openToPublic() function uses the entire contract balance to fund a liquidity-add, the owner could prevent rewards distributions by draining the contract's token balance through repeated calls.
Recommendation: Require that the isOpenToPublic variable is false when calling openToPublic().
Resolution: The team has implemented the solution described above.

Finding #3 - OdysseyProject - Informational (Resolved)

Description: The setOfficers() function only requires that the ceo1 is the 0x0 address.
Risk/Impact: The owner could set all of the other officer positions except the ceo1 address. This would allow them to update all of the other officer addresses to any address at any time.
Recommendation: Require that all 4 officers are the 0x0 address in the setOfficers() function.
Resolution: The team has required that all 4 officers are not the 0x0 address and that each officer must be a unique address.

Contracts Overview

  • As the contracts are implemented with Solidity v0.8.0, they are safe from any possible overflows/underflows.
  • The contracts are built in a gas-optimized manner based on the standard Dividend Paying Token.

  • Odyssey Contract:
    • The total supply of the token is set to 50 billion $ODSY [50,000,000,000].
    • No mint or burn functions are present, though the circulating supply can be reduced by sending tokens to the 0x..dead address if desired.
    • Non-excluded addresses may not transfer tokens until public transfers are enabled; the owner is excluded upon deployment.
    • The contract features a maximum wallet amount which ensures that an address' token balance does not exceed the limit number of tokens after a transfer takes place; the contract and any valid Automatic Market Maker (AMM) are exempt from this limit.
    • There is additionally a maximum sell limit that cannot be exceeded when transferring to a valid AMM.
    • Each transfer, the contract will provide gas to the OdysseyRewards contract to proccess claims.
    • There is a fee on all buys and sells where neither the sender nor the recipient is excluded from fees; the contract and the Project Wallet address are excluded upon deployment.
    • Fees collected on buys are stored within the contract as accumulated project fees.
    • Fees collected on sells are stored within the contract and distributed between accumulated liquidity, project, and tax fees.
    • Once the swap threshold number of tokens is met, three separate swaps will be attempted during transfers that are not a buy or involve the Liquidity address.
    • Each swap is attempted with the swap threshold number of tokens. If there are not sufficient tokens the swap is not performed.
    • The first swap attempted is a liquidity-add.
    • Liquidity-adds are funded by selling half of the tokens accumulated as liquidity fees, then pairing the received BNB with the token, and adding it as liquidity to the BNB pair.
    • The LP tokens received through this process are sent to the Liquidity address. Beyond the inital liquidity added when opening the contract to public transfers, these LP tokens are locked within the contract.
    • The second swap attempted will swap tokens collected as rewards fees for BNB which is subsequently sent to the Odyssey Rewards contract to be distributed as rewards.
    • If the fees are successfully sent to the Odyssey Rewards contract, the current fee distribution and swap threshold is dynamically updated based on the amount of tokens that were swapped and the amount of BNB received in return.
    • The final swap attempted will swap tokens collected as project fees for BNB which is subsequently sent to the Project wallet controlled by the team.
    • The owner may enable public transfers at any time. Doing so will use the contracts token and BNB balance to add liquidity to the Uniswap pair and set the Liquidity address to the contract.
    • The owner may toggle any address as a valid AMM at any time. Doing so will exclude that address from rewards.
    • The owner may add and remove any address from the fee and public transfer excluded lists at any time.
    • The owner may update the gas used to process claims to any value between 250,000 and 750,000 at any time.
    • The Project Wallet may update its own address at any time. This will remove the old address from fee exclusions and add the new address.
    • The owner may update the Odyssey Rewards address at any time.
    • The owner may manually process claims in the Odyssey Rewards contract at any time.
    • The owner may toggle rewards for any address at any time.
    • The owner may set the minimum tokens required for rewards to any value between 1,000,000 and 15,000,000 at any time, given that the new value is less than the current value.
    • The owner may update the rewards waiting period, and toggle staking in the Odyssey Rewards contract at any time.
    RewardsTracker Contract:
    • This contract serves as the base implementation for the OdysseyRewards and OdysseyProject contracts.
    • Users' balances used to calculate rewards and their current pending rewards are tracked within the contract.
    • Any BNB received by the contract is distributed proportionally among token holders, relative to the number of tokens they possess.
    • Users may withdraw their accumulated rewards from the contract at any time.
    OdysseyRewards Contract:
    • This contract is built on top of the RewardsTracker contract to implement additional functionality.
    • Users must hold at least 15,000,000 $ODSY tokens to be eligible for rewards.
    • When staking is enabled, users' balances are weighted from the last time they have sold ODSY tokens.
    • From the time of their last sell, a user's staked balance is 40% of their total balance, increasing by 15% per week until reaching 100% after 4 weeks.
    • The owner may supply any amount of gas to process claims where user's pending rewards are calculated and distributed.
    • The contract will iterate through all token holders and distribute rewards if possible.
    • Users may only be claim or be distributed their rewards once per "waiting period" determined by the team. The waiting period defaults to 6 hours.
    • The amount of gas used when processing claims is dependent on the contract's BNB balance. If the contract has at least 0.1 BNB, claims will be processed until there is less than 65,000 gas whereas if there is less than 0.1 BNB claims will be processed until there is less than 8,500 gas.
    • The owner may include or exclude an account from rewards at any time.
    • The owner may update the minimum balance for rewards to any value at any time.
    • The owner may update the claim waiting period to any value between one hour and one day at any time.
    • The owner may toggle the staking functionality at any time.
    OdysseyProject Contract:
    • This contract is an alternate implementation on top of the RewardsTracker contract.
    • The owner may specify up to 100 holders and their corresponding shares once after deployment.
    • Holders must have at least 10,000,000 shares to be eligible for rewards.
    • The total dividends distributed to holders will be 1/3rd of the total shares allocated.
    • When funds are received, 1/10th of the funds are allocated as dividends for holders, with the rest remaining as funds within the contract, until the total allocated dividends are distributed.
    • Any address may supply any amount of gas to process claims where user's pending rewards are calculated and distributed.
    • The contract will iterate through all token holders and distribute rewards if possible until all the provided gas is used.
    • Users may also manually claim their dividends at any time.
    • The owner may set 4 "officer" addresses once after deployment; two CEOs and two CFOs.
    • The officer addresses may vote to update one of the officer addresses at any time.
    • All 3 of the other officers must vote to update the 4th officer's address. If the 3 officers vote and agree on the address to be changed and the new address to be updated to, the 4th officer will be updated to the new address.
    • If one of the 3 officers supplies a different officer's address to change or new address to be changed to, the existing votes are deleted and the voting process must be restarted.
    • Any of the officers may request funds from the contract at any time. They must supply an amount and a destination address.
    • If one of the CEOs requested the funds, one of the CFOs must approve the request and vice versa.
    • Any of the officers may supply a different address or amount and the existing requests will be deleted and the process must be restarted.
    • Any officer may update the minimum balance for rewards to any value between 1,000,000 and 10,000,000 at any time.
    • The owner may update the Odyssey token address at any time.

    Audit Results

    Vulnerability CategoryNotesResult
    Arbitrary Jump/Storage WriteN/APASS
    Centralization of Control
    • The team retains ownership controls outlined above.
    • The owner of the Odyssey contract may exclude any address from rewards.
    PASS
    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

    OdysseyProject 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 #
    
     + [Lib] SafeMath 
        - [Int] tryAdd
        - [Int] trySub
        - [Int] tryMul
        - [Int] tryDiv
        - [Int] tryMod
        - [Int] add
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] mod
        - [Int] sub
        - [Int] div
        - [Int] mod
    
     + [Lib] SafeMathInt 
        - [Int] mul
        - [Int] div
        - [Int] sub
        - [Int] add
        - [Int] abs
        - [Int] toUint256Safe
    
     + [Lib] SafeMathUint 
        - [Int] toInt256Safe
    
     +  RewardsTracker (Ownable)
        - [Pub] Constructor #
        - [Ext] Receive Ether ($)
        - [Pub] getAccumulated
        - [Pub] getPending
        - [Ext] getWithdrawn
        - [Pub] putBalance #
           - modifiers: onlyOwner
        - [Pub] withdrawFunds #
        - [Int] decreaseBalance #
        - [Int] distributeFunds #
        - [Int] increaseBalance #
        - [Int] processWithdraw #
    
     +  OdysseyRewards (RewardsTracker)
        - [Pub] Constructor #
           - modifiers: RewardsTracker
        - [Ext] getReport
        - [Pub] getReportAccount
        - [Pub] getReportAccountAt
        - [Ext] processClaims #
           - modifiers: onlyOwner
        - [Ext] setExcludedAddress #
           - modifiers: onlyOwner
        - [Ext] setIncludedAddress #
           - modifiers: onlyOwner
        - [Ext] setMinimumBalance #
           - modifiers: onlyOwner
        - [Ext] setWaitingPeriod #
           - modifiers: onlyOwner
        - [Ext] setStaking #
           - modifiers: onlyOwner
        - [Ext] trackBuy #
           - modifiers: onlyOwner
        - [Ext] trackSell #
           - modifiers: onlyOwner
        - [Pub] withdrawFunds #
           - modifiers: onlyOwner
        - [Prv] ageInHours
        - [Prv] ageInWeeks
        - [Prv] canClaim
        - [Prv] holderSet #
        - [Prv] holderRemove #
        - [Prv] setBalance #
        - [Int] stakePercent
        - [Prv] stamp
        - [Int] pushFunds #
        - [Prv] putWeighted #
        - [Int] weightedBalance
        - [Int] updatedWeightedBalance #
    
     + [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 #
    
     + [Int] IUniswapV2Factory 
        - [Ext] feeTo
        - [Ext] feeToSetter
        - [Ext] getPair
        - [Ext] allPairs
        - [Ext] allPairsLength
        - [Ext] createPair #
        - [Ext] setFeeTo #
        - [Ext] setFeeToSetter #
    
     + [Int] IUniswapV2Pair 
        - [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] IUniswapV2Router01 
        - [Ext] factory
        - [Ext] WETH
        - [Ext] addLiquidity #
        - [Ext] addLiquidityETH ($)
        - [Ext] removeLiquidity #
        - [Ext] removeLiquidityETH #
        - [Ext] removeLiquidityWithPermit #
        - [Ext] removeLiquidityETHWithPermit #
        - [Ext] swapExactTokensForTokens #
        - [Ext] swapTokensForExactTokens #
        - [Ext] swapExactETHForTokens ($)
        - [Ext] swapTokensForExactETH #
        - [Ext] swapExactTokensForETH #
        - [Ext] swapETHForExactTokens ($)
        - [Ext] quote
        - [Ext] getAmountOut
        - [Ext] getAmountIn
        - [Ext] getAmountsOut
        - [Ext] getAmountsIn
    
     + [Int] IUniswapV2Router02 (IUniswapV2Router01)
        - [Ext] removeLiquidityETHSupportingFeeOnTransferTokens #
        - [Ext] removeLiquidityETHWithPermitSupportingFeeOnTransferTokens #
        - [Ext] swapExactTokensForTokensSupportingFeeOnTransferTokens #
        - [Ext] swapExactETHForTokensSupportingFeeOnTransferTokens ($)
        - [Ext] swapExactTokensForETHSupportingFeeOnTransferTokens #
    
     +  Odyssey (ERC20, Ownable)
        - [Pub] Constructor #
           - modifiers: ERC20
        - [Ext] Receive Ether ($)
        - [Ext] balanceOfLiquidity
        - [Ext] openToPublic #
           - modifiers: onlyOwner
        - [Ext] setAutomatedMarketMakerPair #
           - modifiers: onlyOwner
        - [Ext] setFeeless #
           - modifiers: onlyOwner
        - [Ext] setGasLimit #
           - modifiers: onlyOwner
        - [Ext] setPresale #
           - modifiers: onlyOwner
        - [Ext] setProjectWallet #
        - [Ext] setRewardsTracker #
           - modifiers: onlyOwner
        - [Ext] getRewardsReport
        - [Ext] getRewardsReportAccount
        - [Ext] getRewardsReportAccountAt
        - [Ext] processRewardsClaims #
           - modifiers: onlyOwner
        - [Ext] setRewardsExcludedAddress #
           - modifiers: onlyOwner
        - [Ext] setRewardsMinimumBalance #
           - modifiers: onlyOwner
        - [Ext] setRewardsStaking #
           - modifiers: onlyOwner
        - [Ext] setRewardsWaitingPeriod #
           - modifiers: onlyOwner
        - [Ext] withdrawRewards #
        - [Int] _transfer #
        - [Prv] addLiquidity #
        - [Prv] changeMarketCap #
        - [Prv] feesChanged #
        - [Prv] processAccumulatedTokens #
        - [Prv] setDefaultRewardsExclusions #
        - [Prv] setFeesByLevel #
        - [Prv] swapAndAddLiquidity #
        - [Prv] swapAndSendToRewardsTracker #
        - [Prv] swapAndSendToProject #
        - [Prv] swapTokensForETH #
        - [Prv] transferAndUpdateRewardsTracker #
    
     +  OdysseyProject (RewardsTracker)
        - [Pub] Constructor #
           - modifiers: RewardsTracker
        - [Pub] getReport
        - [Pub] getReportAccount
        - [Pub] getReportAccountAt
        - [Ext] processClaims #
        - [Ext] replaceContract #
           - modifiers: onlyOfficer
        - [Ext] replaceOfficer #
           - modifiers: onlyOfficer
        - [Ext] requestFunds #
           - modifiers: onlyOfficer
        - [Ext] setHolders #
           - modifiers: onlyOwner
        - [Ext] setOfficers #
           - modifiers: onlyOwner
        - [Ext] setMinimumBalance #
           - modifiers: onlyOfficer
        - [Ext] setToken #
           - modifiers: onlyOwner
        - [Pub] withdrawFunds #
        - [Int] distributeFunds #
        - [Int] holderSet #
        - [Int] setHolder #
        - [Int] pushFunds #
        - [Int] verifyMinimumBalance #
    
    

    OdysseyRewards 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 #
    
     + [Lib] SafeMath 
        - [Int] tryAdd
        - [Int] trySub
        - [Int] tryMul
        - [Int] tryDiv
        - [Int] tryMod
        - [Int] add
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] mod
        - [Int] sub
        - [Int] div
        - [Int] mod
    
     + [Lib] SafeMathInt 
        - [Int] mul
        - [Int] div
        - [Int] sub
        - [Int] add
        - [Int] abs
        - [Int] toUint256Safe
    
     + [Lib] SafeMathUint 
        - [Int] toInt256Safe
    
     +  RewardsTracker (Ownable)
        - [Pub] Constructor #
        - [Ext] Receive Ether ($)
        - [Pub] getAccumulated
        - [Pub] getPending
        - [Ext] getWithdrawn
        - [Pub] putBalance #
           - modifiers: onlyOwner
        - [Pub] withdrawFunds #
        - [Int] decreaseBalance #
        - [Int] distributeFunds #
        - [Int] increaseBalance #
        - [Int] processWithdraw #
    
     +  OdysseyRewards (RewardsTracker)
        - [Pub] Constructor #
           - modifiers: RewardsTracker
        - [Ext] getReport
        - [Pub] getReportAccount
        - [Pub] getReportAccountAt
        - [Ext] processClaims #
           - modifiers: onlyOwner
        - [Ext] setExcludedAddress #
           - modifiers: onlyOwner
        - [Ext] setIncludedAddress #
           - modifiers: onlyOwner
        - [Ext] setMinimumBalance #
           - modifiers: onlyOwner
        - [Ext] setWaitingPeriod #
           - modifiers: onlyOwner
        - [Ext] setStaking #
           - modifiers: onlyOwner
        - [Ext] trackBuy #
           - modifiers: onlyOwner
        - [Ext] trackSell #
           - modifiers: onlyOwner
        - [Pub] withdrawFunds #
           - modifiers: onlyOwner
        - [Prv] ageInHours
        - [Prv] ageInWeeks
        - [Prv] canClaim
        - [Prv] holderSet #
        - [Prv] holderRemove #
        - [Prv] setBalance #
        - [Int] stakePercent
        - [Prv] stamp
        - [Int] pushFunds #
        - [Prv] putWeighted #
        - [Int] weightedBalance
        - [Int] updatedWeightedBalance #
    
    

    Odyssey 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 #
    
     + [Lib] SafeMath 
        - [Int] tryAdd
        - [Int] trySub
        - [Int] tryMul
        - [Int] tryDiv
        - [Int] tryMod
        - [Int] add
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] mod
        - [Int] sub
        - [Int] div
        - [Int] mod
    
     + [Lib] SafeMathInt 
        - [Int] mul
        - [Int] div
        - [Int] sub
        - [Int] add
        - [Int] abs
        - [Int] toUint256Safe
    
     + [Lib] SafeMathUint 
        - [Int] toInt256Safe
    
     +  RewardsTracker (Ownable)
        - [Pub] Constructor #
        - [Ext] Receive Ether ($)
        - [Pub] getAccumulated
        - [Pub] getPending
        - [Ext] getWithdrawn
        - [Pub] putBalance #
           - modifiers: onlyOwner
        - [Pub] withdrawFunds #
        - [Int] decreaseBalance #
        - [Int] distributeFunds #
        - [Int] increaseBalance #
        - [Int] processWithdraw #
    
     +  OdysseyRewards (RewardsTracker)
        - [Pub] Constructor #
           - modifiers: RewardsTracker
        - [Ext] getReport
        - [Pub] getReportAccount
        - [Pub] getReportAccountAt
        - [Ext] processClaims #
           - modifiers: onlyOwner
        - [Ext] setExcludedAddress #
           - modifiers: onlyOwner
        - [Ext] setIncludedAddress #
           - modifiers: onlyOwner
        - [Ext] setMinimumBalance #
           - modifiers: onlyOwner
        - [Ext] setWaitingPeriod #
           - modifiers: onlyOwner
        - [Ext] setStaking #
           - modifiers: onlyOwner
        - [Ext] trackBuy #
           - modifiers: onlyOwner
        - [Ext] trackSell #
           - modifiers: onlyOwner
        - [Pub] withdrawFunds #
           - modifiers: onlyOwner
        - [Prv] ageInHours
        - [Prv] ageInWeeks
        - [Prv] canClaim
        - [Prv] holderSet #
        - [Prv] holderRemove #
        - [Prv] setBalance #
        - [Int] stakePercent
        - [Prv] stamp
        - [Int] pushFunds #
        - [Prv] putWeighted #
        - [Int] weightedBalance
        - [Int] updatedWeightedBalance #
    
     + [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 #
    
     + [Int] IUniswapV2Factory 
        - [Ext] feeTo
        - [Ext] feeToSetter
        - [Ext] getPair
        - [Ext] allPairs
        - [Ext] allPairsLength
        - [Ext] createPair #
        - [Ext] setFeeTo #
        - [Ext] setFeeToSetter #
    
     + [Int] IUniswapV2Pair 
        - [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] IUniswapV2Router01 
        - [Ext] factory
        - [Ext] WETH
        - [Ext] addLiquidity #
        - [Ext] addLiquidityETH ($)
        - [Ext] removeLiquidity #
        - [Ext] removeLiquidityETH #
        - [Ext] removeLiquidityWithPermit #
        - [Ext] removeLiquidityETHWithPermit #
        - [Ext] swapExactTokensForTokens #
        - [Ext] swapTokensForExactTokens #
        - [Ext] swapExactETHForTokens ($)
        - [Ext] swapTokensForExactETH #
        - [Ext] swapExactTokensForETH #
        - [Ext] swapETHForExactTokens ($)
        - [Ext] quote
        - [Ext] getAmountOut
        - [Ext] getAmountIn
        - [Ext] getAmountsOut
        - [Ext] getAmountsIn
    
     + [Int] IUniswapV2Router02 (IUniswapV2Router01)
        - [Ext] removeLiquidityETHSupportingFeeOnTransferTokens #
        - [Ext] removeLiquidityETHWithPermitSupportingFeeOnTransferTokens #
        - [Ext] swapExactTokensForTokensSupportingFeeOnTransferTokens #
        - [Ext] swapExactETHForTokensSupportingFeeOnTransferTokens ($)
        - [Ext] swapExactTokensForETHSupportingFeeOnTransferTokens #
    
     +  Odyssey (ERC20, Ownable)
        - [Pub] Constructor #
           - modifiers: ERC20
        - [Ext] Receive Ether ($)
        - [Ext] balanceOfLiquidity
        - [Ext] openToPublic #
           - modifiers: onlyOwner
        - [Ext] setAutomatedMarketMakerPair #
           - modifiers: onlyOwner
        - [Ext] setFeeless #
           - modifiers: onlyOwner
        - [Ext] setGasLimit #
           - modifiers: onlyOwner
        - [Ext] setPresale #
           - modifiers: onlyOwner
        - [Ext] setProjectWallet #
        - [Ext] setRewardsTracker #
           - modifiers: onlyOwner
        - [Ext] getRewardsReport
        - [Ext] getRewardsReportAccount
        - [Ext] getRewardsReportAccountAt
        - [Ext] processRewardsClaims #
           - modifiers: onlyOwner
        - [Ext] setRewardsExcludedAddress #
           - modifiers: onlyOwner
        - [Ext] setRewardsMinimumBalance #
           - modifiers: onlyOwner
        - [Ext] setRewardsStaking #
           - modifiers: onlyOwner
        - [Ext] setRewardsWaitingPeriod #
           - modifiers: onlyOwner
        - [Ext] withdrawRewards #
        - [Int] _transfer #
        - [Prv] addLiquidity #
        - [Prv] changeMarketCap #
        - [Prv] feesChanged #
        - [Prv] processAccumulatedTokens #
        - [Prv] setDefaultRewardsExclusions #
        - [Prv] setFeesByLevel #
        - [Prv] swapAndAddLiquidity #
        - [Prv] swapAndSendToRewardsTracker #
        - [Prv] swapAndSendToProject #
        - [Prv] swapTokensForETH #
        - [Prv] transferAndUpdateRewardsTracker #
    

    RewardsTracker 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 #
    
     + [Lib] SafeMath 
        - [Int] tryAdd
        - [Int] trySub
        - [Int] tryMul
        - [Int] tryDiv
        - [Int] tryMod
        - [Int] add
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] mod
        - [Int] sub
        - [Int] div
        - [Int] mod
    
     + [Lib] SafeMathInt 
        - [Int] mul
        - [Int] div
        - [Int] sub
        - [Int] add
        - [Int] abs
        - [Int] toUint256Safe
    
     + [Lib] SafeMathUint 
        - [Int] toInt256Safe
    
     +  RewardsTracker (Ownable)
        - [Pub] Constructor #
        - [Ext] Receive Ether ($)
        - [Pub] getAccumulated
        - [Pub] getPending
        - [Ext] getWithdrawn
        - [Pub] putBalance #
           - modifiers: onlyOwner
        - [Pub] withdrawFunds #
        - [Int] decreaseBalance #
        - [Int] distributeFunds #
        - [Int] increaseBalance #
        - [Int] processWithdraw #
    

    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.