Elephant Money - Smart Contract Audit Report

Summary

ElephantMoney Audit Report Elephant Money is building a staking platform along with two new tokens:

  • ElephantDollar ($TRUNK) - a mintable and burnable BEP20 token intended to be a stable coin.
  • ElephantToken ($ELEPHANT) - an automatic liquidity providing protocol that pays out static rewards to holders.

  • For this audit we reviewed the project team's ElephantDollar, Elephant, Treasury, BankrollNetworkStack, ElephantPoolDistributor, ElephantDollarDistributor, Whitelist, ElephantGraveyard, ElephantLiquidityDrive, and ElephantReserve contracts at the following locations:
  • ElephantDollar.sol: GitHub commit a0f4d7b380838efade8311eee294d472
  • Elephant.sol: GitHub commit d42edffc9ed5172623c9bb7cef0a6035
  • ElephantStack.sol: GitHub commit a5911a2891da4b063a69f4aa5b3621c2
  • Distributor.sol: GitHub commit 6ab30a9576c64bcb9a294502baa2395e
  • Treasury.sol: GitHub commit 941a8135e4a30353a514c29d2df2998e
  • Whitelist.sol: GitHub commit 6ad517bee1e06280b69b6a7b7657
  • ElephantReserve.sol: Code provided by the project team.
  • Notes on the Contracts:
    ElephantDollar Contract:
    • ElephantDollar is a BEP20 token with both minting and burning capabilities.
    • Whitelisted users can mint any amount of tokens to any address at any time as long as it does not cause the total supply to exceed the maximum integer value of ~115 quattuorvigintillion.
    • Any user can burn their own tokens at any time to decrease the total supply.
    • This contract is used to create the Elephant Money Stable token ($TRUNK).
    • The ElephantReserve contract is used for buying, selling, and maintaining the price of $TRUNK.
    • The owner has the ability to add/remove any address to/from the Whitelist at any time.
    Elephant Contract:
    • The total supply of the token is initially set to one quadrillion [1,000,000,000,000,000].
    • The ElephantLiquidityDrive contract is intended to be used to hold a presale for 25% of the tokens, where users can deposit ETH for a portion of these tokens based on their their share of ETH deposited. These tokens can only be claimed once the owner ends the presale after after launching.
    • Once this contract is deployed, any user can call launch, which allocates 49% of tokens to the ElephantGraveyard contract, 25% of tokens to the ElephantLiquidityDrive contract, 25% of tokens to be paired with the contract's ETH balance and added to uniswap as liquidity, and 1% of tokens to the contract's owner.
    • The ElephantGraveyard contract is used to store up to 51% of the total Elephant token supply at a time. If the amount exceeds 51%, anyone can rebalance, which will reduce the ElephantGraveyard's holdings to 50% by transferring excess tokens back to the Elephant contract.
    • No mint or burn functions are present, however users can send their tokens to the 0x..dead address, if desired. If the owner does not exclude the 0x..dead address, it will participate in the reward distribution (as a regular holder) and increase proportionally to the rewards it receives. This is can be used as a deflationary mechanism.
    • There is a 5% 'tax fee' and 5% 'liquidity fee' on all transactions for any "non-excluded" address that participates in a transfer. The owner has the ability to turn these taxes on or off at any time.
    • A portion of the tax fee is redistributed to existing token holders instantly and automatically at the time of each transaction.
    • The liquidity fee charged on transactions is stored in the contract and, once a threshold value of 500 billion is met, used to fund Pancakeswap liquidity. This functionality can be enabled/disabled by the owner.
    • Liquidity-adds are funded by selling a portion of the tokens collected as fees (after the threshhold as determined by the owner is met), then pairing the received BNB with the token, and adding it as liquidity to the BNB pair.
    • The recipient of these newly created LP tokens (as a result of this process) is the Owner of the contract.
    • The owner of the contract can exclude and include accounts from transfer fees and reward distribution.
    • The owner has the ability to update the address of the router.
    Treasury Contract:
    • A Treasury holds a defined token which can be withdrawn by whitelisted addresses. This token can not be changed.
    • The owner can add or remove an address from the whitelist at any time.
    BankrollNetworkStackStack Contract:
    • This is a staking contract which allows users to deposit a token, specified by the owner at deployment, in return for rewards over time.
    • When depositing, a once-defined percentage fee is taken. If buyback is enabled, 20% of this fee is taken and eventually converted to WETH (if the specified token is not already WETH) and used to buy Elephant Tokens. Any user can initiate a buyback at any time.
    • The remaining 80% of the fee is added to the dividend balance. If buyback is disabled, the entirety of the fee is added to the dividend balance.
    • The amount after fees is added to the user's tracked balance.
    • Users can also use their tokens to deposit for a different address, or donate tokens to increase the profit per share for all users.
    • Users can withdraw their earnings at any time, or reinvest their earnings directly through the contract. Both of these operations have no fee involved.
    • Users can unstake their funds at any time. A fee is taken and allocated as described above; the remainder can then be withdrawn through the withdraw function.
    • The payout rate, entry fee, and exit fee are all defined upon deployment and cannot be changed.
    • Profit per share is recalculated after any deposit, withdraw, reinvest, or donation.
    • This contract also tracks the number of participants and total transactions.
    • The deposit and sell fees cannot be changed after deployment.
    ElephantPoolDistributor Contract:
    • Whitelisted addresses can add credit balances to this contract, where they are then distributed to pool addresses over time.
    • The owner can add or remove a pool at any time.
    • The payout earned per day is equal to 1% of the credit balance.
    • If the payout has reached a certain threshold, the associated ElephantReserve contract withdraws the payout in ElephantTokens from the Elephant Treasury address, converts it it WETH, and sends it to this contract. The WETH balance of this contract is divided and distributed evenly across pools.
    • When distributing to the pools, the WETH is swapped for the pool's corresponding token before transfer (unless the pool's token is already WETH).
    • The owner can change the ElephantReserve address at any time.
    • The owner can update the threshold for payout to any amount greater than 1e18 at any time.
    • Whitelisted users can update the credit balance of the contract at any time.
    • The ElephantDollarDistributor contract has the same functionality as the ElephantPoolDistributor contract, however the payouts are withdrawn and sent to pools in $TRUNK instead of WETH. This is done through the ElephantReserve contract by withdrawing from the Elephant Treasury address, swapping for BUSD, and using it as collateral to mint $TRUNK. The $TRUNK is then sent back to the ElephantDollarDistributor contract.
    ElephantReserve Contract:
    • In addition to its role in the distributor contracts, his contract facilitates the buying and selling of $TRUNK.
    • When buying, the user must supply BUSD to the contract to be used as collateral.
    • A 1% fee is charged when buying $TRUNK, which is paired with the same number of minted $TRUNK and added as liquidity given a liquidity threshold has been reached. The remaining amount will be minted to the user in a 1:1 ratio to BUSD.
    • Of the remaining 99% of BUSD sent by the user, 75% is sent to the BUSD Treasury, and 25% is swapped for Elephant tokens and sent to the Elephant Treasury.
    • A performance pool, secondary rewards pool, and backed pool all are 'credited' additional amounts. The credit function, along with the rest of the pool contract functions, were not in the scope of this audit. The performance pool is credited the fee amount, the secondary reward pool is credited 2x the fee amount, and the backed pool is credited 8x the fee amount.
    • When a user sells their $TRUNK to the contract, it is transferred to this contract and subsequently burned.
    • A 1% fee is taken; of the remaining amount, 75% is withdrawn from the BUSD Treasury and 25% of the equivalent amount is withdrawn from the Elephant Treasury. These tokens are then transferred to the user.
    • The performance pool and secondary reward pools are then both credited the fee amount, and the backed pool is credited 2x the fee amount.
    • If the address selling is included the contract's parter list, they will only receive the 75% BUSD portion from the treasury (no Elephant).
    • The value of $TRUNK is intended to mantain a 1:1 ratio with BUSD. Whitelisted users must not mint $TRUNK directly from the token contract or the value or $TRUNK will be destabalized.
    • The owner can change the threshold to add liquidity at any time.
    • The Owner can change the backed pool, secondary reward pool, and performance pool addresses at any time.
    • Any Whitelisted address can withdraw funds from the Elephant or BUSD Treasury at any time.
    General Notes Across Contracts:
    • SafeMath is used to prevent overflows.
    • In the Ownable contract used across this project, the owner has the ability to use the "lock" function in order to temporarily set ownership to address(0). Ownership is restored after the duration of time determined by the owner has passed and they use the 'unlock' function. If lock and unlock have been called, ownership can be restored even after renouncing or transferring ownership by calling the unlock function afterwards.
    • Many variables can be declared constant and many functions can be declared external for gas saving purposes.
    Audit Findings Summary
    • No external threats were identified.
    • Please ensure trust in the team prior to investing as they have significant control within the ecosystem. Whitelisted addresses have the ability to withdraw funds from the treasuries and mint $TRUNK at any time.
    • Date: November 11th, 2021

    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
    Flash LoansN/APASS
    Front RunningN/APASS
    Integer Over/UnderflowN/APASS
    Multiple SendsN/APASS
    OraclesN/APASS
    SuicideN/APASS
    State Change External CallsN/APASS
    Unchecked RetvalN/APASS
    User Supplied AssertionN/APASS
    Critical Solidity CompilerN/APASS
    Overall Contract Safety PASS



    Details: ElephantDollar Contract


    MatrixLpAutoCompound Graph

    MatrixLpAutoCompound

    
    
    ($) = payable function
    # = non-constant function
    
     +  Context 
        - [Int] _msgSender
        - [Int] _msgData
    
     +  Ownable (Context)
        - [Int]  #
        - [Pub] owner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Pub] getUnlockTime
        - [Pub] lock #
           - modifiers: onlyOwner
        - [Pub] unlock #
    
     +  Whitelist (Ownable)
        - [Pub] addAddressToWhitelist #
           - modifiers: onlyOwner
        - [Pub] addAddressesToWhitelist #
           - modifiers: onlyOwner
        - [Pub] removeAddressFromWhitelist #
           - modifiers: onlyOwner
        - [Pub] removeAddressesFromWhitelist #
           - modifiers: onlyOwner
    
     + [Lib] SafeMath 
        - [Int] mul
        - [Int] div
        - [Int] sub
        - [Int] add
    
     + [Int] BEP20Basic 
        - [Ext] totalSupply
        - [Ext] balanceOf
        - [Ext] transfer #
    
     +  BasicToken (BEP20Basic)
        - [Pub] totalSupply
        - [Pub] transfer #
        - [Pub] balanceOf
    
     +  BEP20 (BEP20Basic)
        - [Pub] allowance
        - [Pub] transferFrom #
        - [Pub] approve #
    
     +  StandardToken (BEP20, BasicToken)
        - [Pub] transferFrom #
        - [Pub] approve #
        - [Pub] allowance
        - [Pub] increaseApproval #
        - [Pub] decreaseApproval #
    
     +  MintableToken (StandardToken, Whitelist)
        - [Pub] mint #
           - modifiers: onlyWhitelisted,canMint
    
     +  BurnableToken (MintableToken)
        - [Pub] burn #
    
     +  ElephantDollar (BurnableToken)
        - [Pub]  #
           - modifiers: Ownable
        - [Pub] name
        - [Pub] symbol
        - [Pub] mint #
        - [Pub] transferFrom #
        - [Pub] transfer #
        - [Pub] remainingMintableSupply


    Details: Elephant Contract


    MatrixLpAutoCompound Graph

    MatrixLpAutoCompound

    
    
    ($) = payable function
    # = non-constant function
    
     + [Int] IERC20 
        - [Ext] totalSupply
        - [Ext] balanceOf
        - [Ext] transfer #
        - [Ext] allowance
        - [Ext] approve #
        - [Ext] transferFrom #
    
     + [Lib] SafeMath 
        - [Int] add
        - [Int] sub
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] div
        - [Int] mod
        - [Int] mod
    
     +  Context 
        - [Int] _msgSender
        - [Int] _msgData
    
     + [Lib] Address 
        - [Int] isContract
        - [Int] sendValue #
        - [Int] functionCall #
        - [Int] functionCall #
        - [Int] functionCallWithValue #
        - [Int] functionCallWithValue #
        - [Prv] _functionCallWithValue #
    
     +  Ownable (Context)
        - [Int]  #
        - [Pub] owner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Pub] getUnlockTime
        - [Pub] lock #
           - modifiers: onlyOwner
        - [Pub] unlock #
    
     + [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 #
    
     +  ElephantGraveyard (Context, Ownable)
        - [Pub]  #
        - [Ext] rebalance #
        - [Ext] ready
    
     +  ElephantLiquidityDrive (Context, Ownable)
        - [Pub]  #
        - [Ext]  ($)
        - [Pub] donate ($)
           - modifiers: notLaunched
        - [Ext] claimTokens #
        - [Ext] end #
           - modifiers: onlyOwner,notLaunched
        - [Pub] donationsOf
        - [Pub] availableOf
        - [Pub] claimedOf
    
     +  Elephant (Context, IERC20, Ownable)
        - [Pub]  #
        - [Pub] launch #
        - [Pub] ready
        - [Pub] name
        - [Pub] symbol
        - [Pub] decimals
        - [Pub] totalSupply
        - [Pub] balanceOf
        - [Pub] transfer #
        - [Pub] allowance
        - [Pub] approve #
        - [Pub] transferFrom #
        - [Pub] increaseAllowance #
        - [Pub] decreaseAllowance #
        - [Pub] isExcludedFromReward
        - [Pub] totalFees
        - [Pub] reflect #
        - [Pub] reflectionFromToken
        - [Pub] tokenFromReflection
        - [Pub] excludeFromReward #
           - modifiers: onlyOwner
        - [Ext] includeInReward #
           - modifiers: onlyOwner
        - [Prv] _transferBothExcluded #
        - [Pub] excludeFromFee #
           - modifiers: onlyOwner
        - [Pub] includeInFee #
           - modifiers: onlyOwner
        - [Ext]  ($)
        - [Prv] _reflectFee #
        - [Prv] _getValues
        - [Prv] _getTValues
        - [Prv] _getRValues
        - [Prv] _getRate
        - [Prv] _getCurrentSupply
        - [Prv] _takeLiquidity #
        - [Prv] calculateTaxFee
        - [Prv] calculateLiquidityFee
        - [Prv] removeAllFee #
        - [Prv] restoreAllFee #
        - [Pub] isExcludedFromFee
        - [Prv] _approve #
        - [Prv] _transfer #
        - [Prv] swapAndLiquify #
           - modifiers: lockTheSwap
        - [Prv] swapTokensForEth #
        - [Prv] addLiquidity #
        - [Prv] _tokenTransfer #
        - [Prv] _transferStandard #
        - [Prv] _transferToExcluded #
        - [Prv] _transferFromExcluded #


    Details: Treasury Contract


    MatrixLpAutoCompound Graph

    MatrixLpAutoCompound

    
    
    ($) = payable function
    # = non-constant function
    
     +  Context 
        - [Int] _msgSender
        - [Int] _msgData
    
     +  Ownable (Context)
        - [Int]  #
        - [Pub] owner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Pub] getUnlockTime
        - [Pub] lock #
           - modifiers: onlyOwner
        - [Pub] unlock #
    
     +  Whitelist (Ownable)
        - [Pub] addAddressToWhitelist #
           - modifiers: onlyOwner
        - [Pub] addAddressesToWhitelist #
           - modifiers: onlyOwner
        - [Pub] removeAddressFromWhitelist #
           - modifiers: onlyOwner
        - [Pub] removeAddressesFromWhitelist #
           - modifiers: onlyOwner
    
     + [Int] IToken 
        - [Ext] transfer #
    
     +  Treasury (Whitelist)
        - [Pub]  #
           - modifiers: Ownable
        - [Pub] withdraw #
           - modifiers: onlyWhitelisted


    Details: BankrollNetworkStack Contract


    MatrixLpAutoCompound Graph

    MatrixLpAutoCompound

    
    
    ($) = payable function
    # = non-constant function
    
     +  Ownable 
        - [Pub]  #
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
    
     + [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 #
    
     + [Int] Token 
        - [Ext] transferFrom #
        - [Ext] transfer #
        - [Ext] balanceOf
        - [Ext] approve #
    
     +  BankrollNetworkStack (Ownable)
        - [Pub]  #
           - modifiers: Ownable
        - [Pub] sweep #
        - [Pub] enableBuyback #
           - modifiers: onlyOwner
        - [Pub] updateTokenRouter #
           - modifiers: onlyOwner
        - [Prv] buyback #
        - [Pub] donatePool #
        - [Pub] buy #
        - [Pub] buyFor #
        - [Ext]  ($)
        - [Pub] reinvest #
           - modifiers: onlyStronghands
        - [Pub] withdraw #
           - modifiers: onlyStronghands
        - [Pub] sell #
           - modifiers: onlyBagholders
        - [Ext] transfer #
           - modifiers: onlyBagholders
        - [Pub] totalTokenBalance
        - [Pub] totalSupply
        - [Pub] myTokens
        - [Pub] myDividends
        - [Pub] balanceOf
        - [Pub] tokenBalance
        - [Pub] dividendsOf
        - [Pub] sellPrice
        - [Pub] buyPrice
        - [Pub] calculateTokensReceived
        - [Pub] calculateethReceived
        - [Pub] statsOf
        - [Pub] dailyEstimate
        - [Prv] allocateFees #
        - [Prv] distribute #
        - [Int] purchaseTokens #
    
     + [Lib] SafeMath 
        - [Int] mul
        - [Int] div
        - [Int] sub
        - [Int] safeSub
        - [Int] add
        - [Int] max
        - [Int] min


    Details: Distributor Contracts


    MatrixLpAutoCompound Graph

    MatrixLpAutoCompound

    
    
    ($) = payable function
    # = non-constant function
    
     + [Int] IERC20 
        - [Ext] mint #
        - [Ext] burn #
        - [Ext] totalSupply
        - [Ext] balanceOf
        - [Ext] transfer #
        - [Ext] allowance
        - [Ext] approve #
        - [Ext] transferFrom #
    
     + [Lib] SafeMath 
        - [Int] add
        - [Int] sub
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] div
        - [Int] mod
        - [Int] mod
    
     +  Context 
        - [Int] _msgSender
        - [Int] _msgData
    
     + [Lib] Address 
        - [Int] isContract
        - [Int] sendValue #
        - [Int] functionCall #
        - [Int] functionCall #
        - [Int] functionCallWithValue #
        - [Int] functionCallWithValue #
        - [Prv] _functionCallWithValue #
    
     +  Ownable (Context)
        - [Int]  #
        - [Pub] owner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Pub] getUnlockTime
        - [Pub] lock #
           - modifiers: onlyOwner
        - [Pub] unlock #
    
     +  Whitelist (Ownable)
        - [Pub] addAddressToWhitelist #
           - modifiers: onlyOwner
        - [Pub] addAddressesToWhitelist #
           - modifiers: onlyOwner
        - [Pub] removeAddressFromWhitelist #
           - modifiers: onlyOwner
        - [Pub] removeAddressesFromWhitelist #
           - modifiers: onlyOwner
    
     + [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 #
    
     + [Int] ITreasury 
        - [Ext] withdraw #
    
     + [Int] IElephantPool 
        - [Ext] donatePool #
    
     + [Int] IRewardPool 
        - [Ext] credit #
        - [Ext] sweep #
        - [Ext] creditBalance #
    
     +  ElephantPoolDistributor (Whitelist)
        - [Pub]  #
           - modifiers: Ownable
        - [Pub] updateReserve #
           - modifiers: onlyOwner
        - [Pub] updatePayoutThreshold #
           - modifiers: onlyOwner
        - [Pub] updateRouter #
           - modifiers: onlyOwner
        - [Pub] credit #
           - modifiers: onlyWhitelisted
        - [Pub] add #
           - modifiers: onlyOwner
        - [Pub] remove #
           - modifiers: onlyOwner
        - [Pub] contains
        - [Pub] available
        - [Pub] sweep #
        - [Prv] payPool #
    
     +  ElephantDollarDistributor (Whitelist)
        - [Pub]  #
           - modifiers: Ownable
        - [Pub] updateReserve #
           - modifiers: onlyOwner
        - [Pub] updatePayoutThreshold #
           - modifiers: onlyOwner
        - [Pub] credit #
           - modifiers: onlyWhitelisted
        - [Pub] add #
           - modifiers: onlyOwner
        - [Pub] remove #
           - modifiers: onlyOwner
        - [Pub] contains
        - [Pub] available
        - [Pub] dailyEstimate
        - [Pub] sweep #
        - [Prv] payPool #
    
     +  BackedForwardingPool (Ownable)
        - [Pub]  #
           - modifiers: Ownable
        - [Pub] donatePool #
    
     + [Int] IElephantReserve 
        - [Ext] mint #
        - [Ext] estimateMint
        - [Ext] redeem #
        - [Ext] redeemCredit #
        - [Ext] redeemCreditAsBacked #
        - [Ext] estimateRedemption
        - [Ext] estimateCollateralToCore
        - [Ext] estimateCoreToCollateral
        - [Ext] collateralizationRatio
        - [Ext] redeemCollateralCreditToWETH #
    
     + [Lib] EnumerableSet 
        - [Prv] _add #
        - [Prv] _remove #
        - [Prv] _contains
        - [Prv] _length
        - [Prv] _at
        - [Int] add #
        - [Int] remove #
        - [Int] contains
        - [Int] length
        - [Int] at
        - [Int] add #
        - [Int] remove #
        - [Int] contains
        - [Int] length
        - [Int] at
        - [Int] add #
        - [Int] remove #
        - [Int] contains
        - [Int] length
        - [Int] at


    Details: ElephantReserve Contract


    MatrixLpAutoCompound Graph

    MatrixLpAutoCompound

    
    
    ($) = payable function
    # = non-constant function
    
     + [Int] IERC20 
        - [Ext] mint #
        - [Ext] burn #
        - [Ext] totalSupply
        - [Ext] balanceOf
        - [Ext] transfer #
        - [Ext] allowance
        - [Ext] approve #
        - [Ext] transferFrom #
    
     + [Lib] SafeMath 
        - [Int] add
        - [Int] sub
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] div
        - [Int] mod
        - [Int] mod
        - [Int] max
        - [Int] min
    
     +  Context 
        - [Int] _msgSender
        - [Int] _msgData
    
     + [Lib] Address 
        - [Int] isContract
        - [Int] sendValue #
        - [Int] functionCall #
        - [Int] functionCall #
        - [Int] functionCallWithValue #
        - [Int] functionCallWithValue #
        - [Prv] _functionCallWithValue #
    
     +  Ownable (Context)
        - [Int]  #
        - [Pub] owner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Pub] getUnlockTime
        - [Pub] lock #
           - modifiers: onlyOwner
        - [Pub] unlock #
    
     +  Whitelist (Ownable)
        - [Pub] addAddressToWhitelist #
           - modifiers: onlyOwner
        - [Pub] addAddressesToWhitelist #
           - modifiers: onlyOwner
        - [Pub] removeAddressFromWhitelist #
           - modifiers: onlyOwner
        - [Pub] removeAddressesFromWhitelist #
           - modifiers: onlyOwner
    
     + [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 #
    
     + [Int] ITreasury 
        - [Ext] withdraw #
    
     + [Int] IElephantPool 
        - [Ext] donatePool #
    
     + [Int] IRewardPool 
        - [Ext] credit #
        - [Ext] sweep #
        - [Ext] creditBalance
        - [Ext] available
        - [Ext] payoutThreshold
    
     +  ElephantReserve (Context, Whitelist)
        - [Pub]  #
           - modifiers: Ownable
        - [Pub] updateRewardPools #
           - modifiers: onlyOwner
        - [Pub] updateCollateralRouter #
           - modifiers: onlyOwner
        - [Pub] updateAntiSlippageFactor #
           - modifiers: onlyOwner
        - [Pub] updateLiquidityThreshold #
           - modifiers: onlyOwner
        - [Pub] sweep #
        - [Prv] _mint #
        - [Prv] addLiquidity #
        - [Pub] mint #
        - [Pub] estimateMint
        - [Pub] redeem #
        - [Pub] redeemCredit #
           - modifiers: onlyWhitelisted
        - [Pub] redeemCreditAsBacked #
        - [Pub] estimateRedemption
        - [Pub] estimateCollateralToCore
        - [Pub] estimateCoreToCollateral
        - [Pub] collateralizationRatio
        - [Pub] collateralizationRatioLP
        - [Prv] buyCollateralWithCore #
        - [Prv] buyCoreWithCollateral #
        - [Pub] redeemCollateralCreditToWETH #
           - modifiers: onlyWhitelisted