The FourERC20 Token contract serves as an ERC-20 implementation for a proxy. While it correctly implements standard ERC-20 functionalities and utilizes Solidity 0.8+ for integer safety, significant upgradeability risks were identified. The contract lacks a __gap storage variable, which is crucial for preventing storage collisions in future upgrades. Additionally, the _init function, intended for initialization, is not protected against re-initialization and its proper invocation relies entirely on the proxy's setup. The internal _mint and _burn functions lack external access control, leading to an effectively fixed supply unless explicitly managed by the proxy's initializer or a derived contract.

Early-stage security check — honeypot & rug-pull analysis
Is Griot a Scam?
Not verified
This record has not gone through deep verification and is not being monitored. The score is a dated snapshot — the token’s risk can change at any time.Own this token? Put it under verification →The FourERC20 Token contract serves as an ERC-20 implementation for a proxy.
Read the full analysis- Proxy contract
- Non-standard proxy storage
- Top-10 concentration > 30%
- Liquidity < $50k
- Token age < 24h
- 1 Critical finding(s) from audit
- 1 High finding(s) from audit
- 1 Medium finding(s) from audit
- 1 Low finding(s) from audit
Exact factors
- Proxy contract (upgradeable — admin can replace logic)
- Non-standard proxy storage (Etherscan-confirmed)
- Top-10 concentration > 30% (55.0% total → 41.3% effective; 32.2% in EOAs, 22.8% in contracts — moderate)
- Liquidity < $50k ($25,660 across 1 pairs — thin market)
- Token age < 24h (brand new — bot activity, unproven)
- 1 Critical finding(s) from audit
- 1 High finding(s) from audit
- 1 Medium finding(s) from audit
- 1 Low finding(s) from audit
Each factor is an on-chain fact recorded at the time of this analysis. The score is computed from them by a deterministic function, so the same contract returns the same score for anyone who runs the audit. How scores are computed
Security Checklist
as of audit · Sep 4Holders
as of audit · Sep 4, 2026- Contractstreasury, vesting, bridge, staking22.8%
- Walletsanonymous holders, free to sell32.2%
- Everyone elsethe rest of the supply45.0%
How holder types affect the score
Share held by contracts — treasury, vesting, bridge or staking — is discounted against share held by wallets when the score is computed: a contract cannot decide to sell the way an anonymous holder can, though it can still be drained or voted to sell. Effective concentration is the figure the risk score is actually calculated from.
Holder balances as recorded by the audit of Sep 4, 2026
Liquidity
as of audit · Sep 4The risk score reads depth across every pair.
The LP tokens of the analysed pool are locked or burned.
Security Findings
CriticalMissing __gap Storage Variable and Unprotected Initializer in Proxy Implementation
The FourERC20 contract is designed as an implementation for a proxy but does not include a __gap storage variable. This omission is a critical vulnerability in upgradeable contracts, as it can lead to storage collisions if new state variables are added in future upgrades, potentially corrupting existing data. Furthermore, the _init function, which sets _name and _symbol, is internal virtual and lacks an initializer modifier. This means it can be called multiple times, leading to re-initialization vulnerabilities if the proxy's initializer logic is not perfectly implemented and protected.C-01
__gap Storage Variable and Unprotected Initializer in Proxy ImplementationIssue
The FourERC20 contract is designed as an implementation for a proxy but does not include a __gap storage variable. This omission is a critical vulnerability in upgradeable contracts, as it can lead to storage collisions if new state variables are added in future upgrades, potentially corrupting existing data. Furthermore, the _init function, which sets _name and _symbol, is internal virtual and lacks an initializer modifier. This means it can be called multiple times, leading to re-initialization vulnerabilities if the proxy's initializer logic is not perfectly implemented and protected.
Fix
Implement a __gap storage array (e.g., uint256[50] private __gap;) to reserve storage slots for future upgrades. Inherit from OpenZeppelin's Initializable contract and use the initializer modifier on the _init function to ensure it can only be called once. Ensure the proxy's initializer correctly calls _init exactly once upon deployment.
Status
Unresolved
HighUncontrolled Mint/Burn Functionality
The _mint and _burn functions are internal virtual and are not exposed through any public or external functions within the FourERC20 contract. This means there is no mechanism to mint new tokens or burn existing ones after the initial deployment (unless _mint is called by the proxy's initializer, which is not standard for ongoing supply management). If the intention is for a dynamic supply, this design prevents any supply management. If the intention is for a fixed supply, the presence of these functions can be misleading and their potential use by a derived contract or initializer is not explicitly controlled.H-01
Issue
The _mint and _burn functions are internal virtual and are not exposed through any public or external functions within the FourERC20 contract. This means there is no mechanism to mint new tokens or burn existing ones after the initial deployment (unless _mint is called by the proxy's initializer, which is not standard for ongoing supply management). If the intention is for a dynamic supply, this design prevents any supply management. If the intention is for a fixed supply, the presence of these functions can be misleading and their potential use by a derived contract or initializer is not explicitly controlled.
Fix
Clearly define the token's supply policy. If a fixed supply is desired, consider removing _mint and _burn or ensure they are never called. If a dynamic supply is intended, implement public/external functions with appropriate access control (e.g., Ownable or role-based access control) to manage minting and burning operations.
Status
Unresolved
MediumincreaseAllowance Potential Overflow Risk
The increaseAllowance function calculates the new allowance as allowance(owner, spender) + addedValue. While Solidity 0.8+ prevents uint256 overflow by default, this operation could theoretically overflow if the sum exceeds type(uint256).max. Although highly improbable in practical scenarios, an overflow would cause the allowance to wrap around to a very small number, potentially leading to unexpected behavior or denial of service for the spender if they rely on a large allowance.M-01
increaseAllowance Potential Overflow RiskIssue
The increaseAllowance function calculates the new allowance as allowance(owner, spender) + addedValue. While Solidity 0.8+ prevents uint256 overflow by default, this operation could theoretically overflow if the sum exceeds type(uint256).max. Although highly improbable in practical scenarios, an overflow would cause the allowance to wrap around to a very small number, potentially leading to unexpected behavior or denial of service for the spender if they rely on a large allowance.
Fix
While the likelihood is low, consider adding an explicit require check to ensure allowance(owner, spender) + addedValue does not overflow, or use OpenZeppelin's SafeMath library (if not already implicitly handled by 0.8+ context) for clarity, although 0.8+ generally handles this. For example: `require(type(uint256).max - currentAllowance >= addedValue, 'ERC20: allowance overflow');`
Status
Unresolved
LowMissing Event for _init Function
The _init function, which sets the token's _name and _symbol, does not emit an event upon successful execution. Emitting an event for critical initialization parameters is a best practice for transparency, allowing off-chain applications and block explorers to easily track and verify the token's initial configuration.L-01
_init FunctionIssue
The _init function, which sets the token's _name and _symbol, does not emit an event upon successful execution. Emitting an event for critical initialization parameters is a best practice for transparency, allowing off-chain applications and block explorers to easily track and verify the token's initial configuration.
Fix
Add an event (e.g., Initialized(string name, string symbol)) and emit it within the _init function after setting _name and _symbol.
Status
Unresolved
InfoUnused PancakeSwap Interfaces
The contract includes interfaces for IPancakeFactory, IPancakePair, and IPancakeRouter01. However, these interfaces are not utilized anywhere within the FourERC20 contract's logic. Including unused interfaces adds unnecessary code to the contract, slightly increasing its bytecode size and deployment cost without providing any direct functionality.I-01
Issue
The contract includes interfaces for IPancakeFactory, IPancakePair, and IPancakeRouter01. However, these interfaces are not utilized anywhere within the FourERC20 contract's logic. Including unused interfaces adds unnecessary code to the contract, slightly increasing its bytecode size and deployment cost without providing any direct functionality.
Fix
Remove the unused PancakeSwap interface imports (IPancakeFactory.sol, IPancakePair.sol, IPancakeRouter01.sol) to reduce bytecode size and improve code clarity, unless they are intended for future integration in a derived contract.
Status
Unresolved
InfoRedundant Use of _msgSender() for Standard ERC-20 Functions
The transfer and approve functions use _msgSender() to retrieve the calling address. While _msgSender() is correct and useful for meta-transactions or more complex Context scenarios, for standard ERC-20 functions like transfer and approve, msg.sender is typically used directly. This is a minor stylistic choice and does not introduce a vulnerability.I-02
_msgSender() for Standard ERC-20 FunctionsIssue
The transfer and approve functions use _msgSender() to retrieve the calling address. While _msgSender() is correct and useful for meta-transactions or more complex Context scenarios, for standard ERC-20 functions like transfer and approve, msg.sender is typically used directly. This is a minor stylistic choice and does not introduce a vulnerability.
Fix
For simplicity and consistency with common ERC-20 implementations, consider using msg.sender directly in transfer and approve functions, as _msgSender() is primarily intended for more advanced Context usage.
Status
Unresolved
Analysis
AI Copilotas of audit · Sep 4The contract implements standard ERC-20 functionality, leveraging Solidity 0.8+ for default integer overflow/underflow protection and OpenZeppelin interfaces. The use of unchecked blocks is generally safe due to preceding require statements (7.2 Code Security). However, the increaseAllowance function has a theoretical overflow risk (7.2 Code Security). A major concern is the lack of explicit access control for _mint and _burn functions, making the token supply effectively fixed unless managed externally (7.3 Access Control).
The contract is a basic ERC-20 token with no inherent governance mechanisms or complex economic models (7.5 Governance). The supply is effectively fixed due to the internal nature of _mint and _burn functions, which simplifies the economic model and reduces associated risks (7.4 Economic). There are no fees or rebase mechanisms implemented.
As an implementation contract for a proxy, the FourERC20 contract presents significant upgradeability risks (7.7 Upgrades). It lacks a __gap storage variable, which is critical for preventing storage collisions with future upgrades. The _init function, intended for initialization, is internal virtual and not protected by an initializer modifier, making it vulnerable to re-initialization if the proxy's logic is flawed. This design choice increases the complexity and risk of future upgrades and deployments (7.1 Architecture, 7.8 Operations).
It is strongly recommended to refactor the contract to adhere to established upgradeable contract patterns, such as inheriting from OpenZeppelin's UUPSUpgradeable or ERC1967Upgrade and including a __gap storage array.
Implement an initializer modifier for the _init function to prevent re-initialization. Clearly define and implement access control for _mint and _burn if a dynamic supply is intended, or remove them if the supply is meant to be strictly fixed. Consider removing unused interfaces to reduce bytecode size and improve clarity.
Contract & Record
Free for any token on the record. It links to this page and always shows the current score and the date it was checked.
- Sep 4, 202657Medium
- Sep 3, 202638Medium
Score changes are recorded as dated snapshots — history is append-only and cannot be edited.
Frequently Asked Questions
What is the GRIOT contract address?
The Griot contract on BNB Chain is 0xa6e3eacdf8e6a1ea02052693838f3653fa3bffff. Compare it with the address the project itself publishes before trading: other contracts can carry the same name and ticker.
Is Griot a scam?
Quantum Audit's risk score for Griot is 57/100 (Medium risk) as of Sep 4, 2026, computed by a deterministic function from on-chain facts — Contract verified: Verified; Ownership: Renounced; Mint: No mint; Liquidity lock: Locked; Upgradeability: Upgradeable; Honeypot: None found; Buy / sell tax: 1% / 2%. A score is a dated snapshot of those facts, not a guarantee; each one is listed on this page.
Is GRIOT liquidity locked?
Liquidity lock: Locked (as of Sep 4, 2026). Total DEX liquidity: $25.7K.
Who holds GRIOT?
As of Sep 4, 2026, the 10 largest holders own 55.0% of the supply. The Holders section on this page shows who they are by holder type.
Would You Like a More Detailed Audit of Griot?
This token is brand new. Run a deeper AI-powered analysis of the contract code — free and instant.
Get Detailed Audit Is this your token? Publish your own audit on this page