Fate of Saga is an NFT turn-based RPG with 3D realistic game mode on Binance Smart Chain with outstanding graphic design and natural realism. The game will be sci-fi fantasy with a unique gameplay style with a variety of team play.
Unable to find manual contract audit (e.g. Certik, PeckShield, Solidity...)
ERC20Votes._writeCheckpoint(ERC20Votes.Checkpoint[],function(uint256,uint256) returns(uint256),uint256) (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#237-251) uses a dangerous strict equality:
- pos > 0 && ckpts[pos - 1].fromBlock == block.number (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#246)
Don't use strict equality to determine if an account has enough Ether or tokens.
Additional information: link
ERC20Permit.constructor(string).name (@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol#36) shadows:
- ERC20.name() (@openzeppelin/contracts/token/ERC20/ERC20.sol#62-64) (function)
- IERC20Metadata.name() (@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol#17) (function)
Rename the local variables that shadow another component.
Additional information: link
ERC20Votes._moveVotingPower(address,address,uint256).newWeight_scope_1 (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#231) is a local variable never initialized
ERC20Votes._moveVotingPower(address,address,uint256).oldWeight_scope_0 (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#231) is a local variable never initialized
Initialize all the variables. If a variable is meant to be initialized to zero, explicitly set it to zero to improve code readability.
Additional information: link
AccessControlEnumerable._grantRole(bytes32,address) (@openzeppelin/contracts/access/AccessControlEnumerable.sol#52-55) ignores return value by _roleMembers[role].add(account) (@openzeppelin/contracts/access/AccessControlEnumerable.sol#54)
AccessControlEnumerable._revokeRole(bytes32,address) (@openzeppelin/contracts/access/AccessControlEnumerable.sol#60-63) ignores return value by _roleMembers[role].remove(account) (@openzeppelin/contracts/access/AccessControlEnumerable.sol#62)
Ensure that all the return values of the function calls are used.
Additional information: link
FateOfSagaToken.constructor() (contracts/FateofSagaToken.sol#13-20) uses literals with too many digits:
- _mint(getRoleMember(DEFAULT_ADMIN_ROLE,0),250000000 * 10 ** decimals()) (contracts/FateofSagaToken.sol#19)
Use: Ether suffix, Time suffix, or The scientific notation
Additional information: link
Variable 'ERC20Votes._moveVotingPower(address,address,uint256).newWeight (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#226)' in ERC20Votes._moveVotingPower(address,address,uint256) (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#219-235) potentially used before declaration: (oldWeight,newWeight) = _writeCheckpoint(_checkpoints[dst],_add,amount) (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#231)
Variable 'ERC20Votes._moveVotingPower(address,address,uint256).oldWeight (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#226)' in ERC20Votes._moveVotingPower(address,address,uint256) (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#219-235) potentially used before declaration: (oldWeight,newWeight) = _writeCheckpoint(_checkpoints[dst],_add,amount) (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#231)
Variable 'ECDSA.tryRecover(bytes32,bytes).r (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#62)' in ECDSA.tryRecover(bytes32,bytes) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#57-86) potentially used before declaration: r = mload(uint256)(signature + 0x20) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#79)
Move all variable declarations prior to any usage of the variable, and ensure that reaching a variable declaration does not depend on some conditional if it is used unconditionally.
Additional information: link
ERC20Votes.delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32) (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#144-161) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(block.timestamp <= expiry,ERC20Votes: signature expired) (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#152)
ERC20Permit.permit(address,address,uint256,uint256,uint8,bytes32,bytes32) (@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol#41-60) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(block.timestamp <= deadline,ERC20Permit: expired deadline) (@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol#50)
Avoid relying on block.timestamp.
Additional information: link
ECDSA.tryRecover(bytes32,bytes) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#57-86) uses assembly
- INLINE ASM (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#67-71)
- INLINE ASM (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#78-81)
ECDSA.tryRecover(bytes32,bytes32,bytes32) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#115-127) uses assembly
- INLINE ASM (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#122-125)
EnumerableSet.values(EnumerableSet.AddressSet) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#274-283) uses assembly
- INLINE ASM (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#278-280)
EnumerableSet.values(EnumerableSet.UintSet) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#347-356) uses assembly
- INLINE ASM (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#351-353)
Do not use evm assembly.
Additional information: link
Different versions of Solidity is used:
- Version used: ['^0.8.0', '^0.8.2']
- ^0.8.0 (@openzeppelin/contracts/access/AccessControl.sol#4)
- ^0.8.0 (@openzeppelin/contracts/access/AccessControlEnumerable.sol#4)
- ^0.8.0 (@openzeppelin/contracts/access/IAccessControl.sol#4)
- ^0.8.0 (@openzeppelin/contracts/access/IAccessControlEnumerable.sol#4)
- ^0.8.0 (@openzeppelin/contracts/security/Pausable.sol#4)
- ^0.8.0 (@openzeppelin/contracts/token/ERC20/ERC20.sol#4)
- ^0.8.0 (@openzeppelin/contracts/token/ERC20/IERC20.sol#4)
- ^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol#4)
- ^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#4)
- ^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol#4)
- ^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol#4)
- ^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol#4)
- ^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/Context.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/Counters.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/Strings.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/introspection/ERC165.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/introspection/IERC165.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/math/Math.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/math/SafeCast.sol#4)
- ^0.8.0 (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#4)
- ^0.8.2 (contracts/FateofSagaToken.sol#2)
Use one Solidity version.
Additional information: link
AccessControl._setRoleAdmin(bytes32,bytes32) (@openzeppelin/contracts/access/AccessControl.sol#194-198) is never used and should be removed
AccessControl._setupRole(bytes32,address) (@openzeppelin/contracts/access/AccessControl.sol#185-187) is never used and should be removed
Context._msgData() (@openzeppelin/contracts/utils/Context.sol#21-23) is never used and should be removed
Counters.decrement(Counters.Counter) (@openzeppelin/contracts/utils/Counters.sol#32-38) is never used and should be removed
Counters.reset(Counters.Counter) (@openzeppelin/contracts/utils/Counters.sol#40-42) is never used and should be removed
ECDSA.recover(bytes32,bytes) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#102-106) is never used and should be removed
ECDSA.recover(bytes32,bytes32,bytes32) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#134-142) is never used and should be removed
ECDSA.toEthSignedMessageHash(bytes) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#218-220) is never used and should be removed
ECDSA.toEthSignedMessageHash(bytes32) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#204-208) is never used and should be removed
ECDSA.tryRecover(bytes32,bytes) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#57-86) is never used and should be removed
ECDSA.tryRecover(bytes32,bytes32,bytes32) (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#115-127) is never used and should be removed
ERC20Votes._add(uint256,uint256) (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#253-255) is never used and should be removed
ERC20Votes._maxSupply() (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#166-168) is never used and should be removed
ERC20Votes._subtract(uint256,uint256) (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#257-259) is never used and should be removed
EnumerableSet._values(EnumerableSet.Set) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#142-144) is never used and should be removed
EnumerableSet.add(EnumerableSet.Bytes32Set,bytes32) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#158-160) is never used and should be removed
EnumerableSet.add(EnumerableSet.UintSet,uint256) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#297-299) is never used and should be removed
EnumerableSet.at(EnumerableSet.Bytes32Set,uint256) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#196-198) is never used and should be removed
EnumerableSet.at(EnumerableSet.UintSet,uint256) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#335-337) is never used and should be removed
EnumerableSet.contains(EnumerableSet.AddressSet,address) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#241-243) is never used and should be removed
EnumerableSet.contains(EnumerableSet.Bytes32Set,bytes32) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#175-177) is never used and should be removed
EnumerableSet.contains(EnumerableSet.UintSet,uint256) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#314-316) is never used and should be removed
EnumerableSet.length(EnumerableSet.Bytes32Set) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#182-184) is never used and should be removed
EnumerableSet.length(EnumerableSet.UintSet) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#321-323) is never used and should be removed
EnumerableSet.remove(EnumerableSet.Bytes32Set,bytes32) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#168-170) is never used and should be removed
EnumerableSet.remove(EnumerableSet.UintSet,uint256) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#307-309) is never used and should be removed
EnumerableSet.values(EnumerableSet.AddressSet) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#274-283) is never used and should be removed
EnumerableSet.values(EnumerableSet.Bytes32Set) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#208-210) is never used and should be removed
EnumerableSet.values(EnumerableSet.UintSet) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#347-356) is never used and should be removed
Math.ceilDiv(uint256,uint256) (@openzeppelin/contracts/utils/math/Math.sol#39-42) is never used and should be removed
Math.max(uint256,uint256) (@openzeppelin/contracts/utils/math/Math.sol#13-15) is never used and should be removed
Math.min(uint256,uint256) (@openzeppelin/contracts/utils/math/Math.sol#20-22) is never used and should be removed
SafeCast.toInt128(int256) (@openzeppelin/contracts/utils/math/SafeCast.sol#152-155) is never used and should be removed
SafeCast.toInt16(int256) (@openzeppelin/contracts/utils/math/SafeCast.sol#206-209) is never used and should be removed
SafeCast.toInt256(uint256) (@openzeppelin/contracts/utils/math/SafeCast.sol#236-240) is never used and should be removed
SafeCast.toInt32(int256) (@openzeppelin/contracts/utils/math/SafeCast.sol#188-191) is never used and should be removed
SafeCast.toInt64(int256) (@openzeppelin/contracts/utils/math/SafeCast.sol#170-173) is never used and should be removed
SafeCast.toInt8(int256) (@openzeppelin/contracts/utils/math/SafeCast.sol#224-227) is never used and should be removed
SafeCast.toUint128(uint256) (@openzeppelin/contracts/utils/math/SafeCast.sol#47-50) is never used and should be removed
SafeCast.toUint16(uint256) (@openzeppelin/contracts/utils/math/SafeCast.sol#107-110) is never used and should be removed
SafeCast.toUint256(int256) (@openzeppelin/contracts/utils/math/SafeCast.sol#134-137) is never used and should be removed
SafeCast.toUint64(uint256) (@openzeppelin/contracts/utils/math/SafeCast.sol#77-80) is never used and should be removed
SafeCast.toUint8(uint256) (@openzeppelin/contracts/utils/math/SafeCast.sol#122-125) is never used and should be removed
Strings.toHexString(uint256) (@openzeppelin/contracts/utils/Strings.sol#40-51) is never used and should be removed
Strings.toString(uint256) (@openzeppelin/contracts/utils/Strings.sol#15-35) is never used and should be removed
Remove unused functions.
Additional information: link
Pragma version^0.8.0 (@openzeppelin/contracts/access/AccessControl.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/access/AccessControlEnumerable.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/access/IAccessControl.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/access/IAccessControlEnumerable.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/security/Pausable.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/token/ERC20/ERC20.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/token/ERC20/IERC20.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/Context.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/Counters.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/Strings.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/cryptography/ECDSA.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/introspection/ERC165.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/introspection/IERC165.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/math/Math.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/math/SafeCast.sol#4) allows old versions
Pragma version^0.8.0 (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#4) allows old versions
Pragma version^0.8.2 (contracts/FateofSagaToken.sol#2) allows old versions
solc-0.8.10 is not recommended for deployment
Deploy with any of the following Solidity versions: 0.5.16 - 0.5.17, 0.6.11 - 0.6.12, 0.7.5 - 0.7.6 Use a simple pragma version that allows any of these versions. Consider using the latest version of Solidity for testing.
Additional information: link
Function ERC20Permit.DOMAIN_SEPARATOR() (@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol#73-75) is not in mixedCase
Variable ERC20Permit._PERMIT_TYPEHASH (@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol#28-29) is not in mixedCase
Function IERC20Permit.DOMAIN_SEPARATOR() (@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol#59) is not in mixedCase
Variable EIP712._CACHED_DOMAIN_SEPARATOR (@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol#31) is not in mixedCase
Variable EIP712._CACHED_CHAIN_ID (@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol#32) is not in mixedCase
Variable EIP712._CACHED_THIS (@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol#33) is not in mixedCase
Variable EIP712._HASHED_NAME (@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol#35) is not in mixedCase
Variable EIP712._HASHED_VERSION (@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol#36) is not in mixedCase
Variable EIP712._TYPE_HASH (@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol#37) is not in mixedCase
Function FateOfSagaToken.burn_InPool_byCEOorCTO(uint256) (contracts/FateofSagaToken.sol#22-24) is not in mixedCase
Parameter FateOfSagaToken.burn_InPool_byCEOorCTO(uint256)._amount (contracts/FateofSagaToken.sol#22) is not in mixedCase
Function FateOfSagaToken.pause_byCEOorCTO() (contracts/FateofSagaToken.sol#26-28) is not in mixedCase
Function FateOfSagaToken.unpause_byCEOorCTO() (contracts/FateofSagaToken.sol#30-32) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
Unable to find token contract audit
Unable to find token on CoinGecko
Additional information: link
Unable to find token on CoinMarketCap
Additional information: link
Unable to find token on CoinHunt
Additional information: link
Unable to find audit link on the website
Token is not listed at Mobula.Finance
Additional information: link
Token has no active CoinGecko listing / rank
Token has no active CoinMarketCap listing / rank
Young tokens have high risks of price dump / death
Young tokens have high risks of price dump / death
Young tokens have high risks of price dump / death
Last post in Twitter was more than 30 days ago