MemeToro Info

MemeToro is an open-source memecoin launchpad on BNB Chain powered by the MemeToro AI agent and $MT, with public smart contracts enforcing every launch.

MemeToro Logo

TrustNet Score

The TrustNet Score evaluates crypto projects based on audit results, security, KYC verification, and social media presence. This score offers a quick, transparent view of a project's credibility, helping users make informed decisions in the Web3 space.

58.65
Poor Excellent

Real-Time Threat Detection

Real-time threat detection, powered by Cyvers.io, is currently not activated for this project.

This advanced feature provides continuous monitoring and instant alerts to safeguard your assets from potential security threats. Real-time detection enhances your project's security by proactively identifying and mitigating risks. For more information, click here.

Security Assessments

"Static Analysis Dynamic Analysis Symbolic Execution SWC Check Manual Review"
Contract address
N/A
Network N/A
License N/A
Compiler N/A
Type N/A
Language Solidity
Onboard date 2026/09/01
Revision date 2026/09/01

Summary and Final Words

No crucial issues found

The contract does not contain issues of high or medium criticality. This means that no known vulnerabilities were found in the source code.

Contract owner cannot mint

It is not possible to mint new tokens.

Contract owner cannot blacklist addresses.

It is not possible to lock user funds by blacklisting addresses.

Contract owner cannot set high fees

The fees, if applicable, can be a maximum of 25% or lower. The contract can therefore not be locked. Please take a look in the comment section for more details.

Token transfer can be locked

Owner can lock user funds with owner functions.

Token cannot be burned

There is no burning within the contract without any allowances

Ownership is not renounced

The owner retains significant control, which could potentially be used to modify key contract parameters.

Contract is not upgradeable

The contract does not use proxy patterns or other mechanisms to allow future upgrades. Its behavior is locked in its current state.

Scope of Work

This audit encompasses the evaluation of the files listed below, each verified with a SHA-1 Hash. The team referenced above has provided the necessary files for assessment.

The auditing process consists of the following systematic steps:

  1. Specification Review: Analyze the provided specifications, source code, and instructions to fully understand the smart contract's size, scope, and functionality.
  2. Manual Code Examination: Conduct a thorough line-by-line review of the source code to identify potential vulnerabilities and areas for improvement.
  3. Specification Alignment: Ensure that the code accurately implements the provided specifications and intended functionalities.
  4. Test Coverage Assessment: Evaluate the extent and effectiveness of test cases in covering the codebase, identifying any gaps in testing.
  5. Symbolic Execution: Analyze the smart contract to determine how various inputs affect execution paths, identifying potential edge cases and vulnerabilities.
  6. Best Practices Evaluation: Assess the smart contracts against established industry and academic best practices to enhance efficiency, maintainability, and security.
  7. Actionable Recommendations: Provide detailed, specific, and actionable steps to secure and optimize the smart contracts.

A file with a different Hash has been intentionally or otherwise modified after the security review. A different Hash may indicate a changed condition or potential vulnerability that was not within the scope of this review.

Final Words

The following provides a concise summary of the audit report, accompanied by insightful comments from the auditor. This overview captures the key findings and observations, offering valuable context and clarity.


Smart Contract Analysis Statement

Contract Analysis

The MemeToro contract implements an ERC20 token with a fixed supply of 1,200,000,000 MT created once at deployment and a one-time launch gate that blocks all transfers until the owner opens trading. It is a deliberately minimal contract - 35 lines of project code on top of a current, well-established token library - and the implementation of what is there is clean. There is no mint function, no burn function, no fee logic, no rebase, no blacklist, no pause switch, and no upgrade mechanism. We recompiled the published source with the exact settings recorded on the block explorer and confirmed it is a byte-for-byte match with the code actually deployed, including the metadata fingerprint, so what you can read is exactly what is running. Reading the deployed instructions directly, we found no instruction anywhere in the contract that calls another contract, none that could destroy it, and none that could redirect it to different logic. That makes whole families of common vulnerabilities - reentrancy, untrusted external calls, price oracle manipulation, proxy takeover - structurally impossible here rather than merely absent. Every one of the twenty-seven function and error identifiers embedded in the deployed code corresponds to a documented entry point, so there is nothing hidden.

The risk in this token is therefore not in its arithmetic or its memory handling; it is in who controls it and in the fact that, at the time of this review, the token cannot be traded. The live contract still has trading switched off while roughly 34 percent of the supply, around 411 million tokens, already sits with addresses that are not on the exemption list. None of those holders can sell, and none can transfer to an address of their own choosing. To be precise, they are not completely immobilised: the check allows a transfer when either side is exempt, so a holder can still send to the owner, to the conventional dead address, or to the token contract itself. All three of those are one-way destinations that give the position away or destroy it, and nothing can be brought back out of them, so the practical effect is the same as a freeze. There is no liquidity pool on either major decentralised exchange version, so there is no market either. Whether a market ever opens rests entirely with a single key, with no deadline and no fallback.

Ownership Privileges

The ownership of the contract has been retained by a single externally owned account, which we verified on-chain to have no contract code and therefore to be an ordinary wallet rather than a multi-signature arrangement. That same address holds about 65.75 percent of the total supply. There is no timelock, no delay, and no two-step confirmation on any administrative action. The owner retains full privileges including:

  • Deciding whether trading ever opens, and at which exact moment - the token is currently closed and there is no deadline that would open it automatically.
  • Granting or withdrawing the transfer exemption for any address at will, which before launch means controlling both whether an early market exists and who may use it. Exempting a pool address opens trading against that pool for everyone, whereas exempting a single individual instead gives that one address an exclusive channel to a pool nobody else can reach. Either can be revoked at any moment.
  • Transferring ownership to another address in a single transaction, with no confirmation step from the recipient and no way to reverse a mistake.
  • Giving up ownership entirely - which, if done while trading is still closed, would permanently freeze the token for every holder with no possibility of recovery. This is the most urgent issue we identified, because giving up ownership is a step many teams take in good faith to signal that they cannot interfere.
  • The owner cannot create new tokens. No minting function exists in the contract, and we confirmed the supply is fixed through three independent methods.
  • The owner cannot destroy tokens or reduce the total supply. There is no burn function and transfers to the zero address are rejected.
  • The owner cannot set or change any fee. No fee mechanism exists at all, so the amount received always equals the amount sent.
  • The owner cannot take, freeze, or reassign an individual holder's balance, cannot block a specific address once trading is open, and cannot upgrade or replace the contract's logic.

Security Features

The contract implements several positive security features:

  • The launch gate is genuinely one-way. The trading flag is only ever set to true, and no function anywhere in the contract can set it back. Once trading opens it can never be closed again, which removes the freeze-and-trap pattern that is the most common way tokens of this shape are abused. Opening trading also permanently retires the ownership-renouncement risk described above.
  • The token supply is provably fixed. Because no minting or burning entry point exists, the total can never change after deployment. We confirmed this by symbolic proof, by property-based fuzzing across more than 440,000 randomised calls, and by reading the deployed instructions.
  • The contract makes no external calls and holds no other assets, so it cannot be drained, cannot be manipulated through a malicious counterparty contract, and depends on no price feed. Frozen balances are never silently reduced - holders retain their exact balance even while unable to move it.
  • Full conformance with the token standard, modern custom errors throughout, and events emitted on every state change including both administrative functions, so the contract's behaviour is fully observable off-chain. The contract also cannot accept the network's native currency, so no funds can become trapped in it that way.

Note - This Audit report consists of a security analysis of the MemeToro smart contract. This analysis did not include economic analysis of the contract's tokenomics. Moreover, we only audited the main contract for the MemeToro team. Other contracts associated with the project were not audited by our team. Because the contract is not upgradeable, the code-level findings cannot be corrected on the existing deployment and would require a new deployment; the two most significant risks, however, can be resolved on the live token today through owner action alone. We recommend investors do their own research before investing.

Files and details

Findings and Audit result

medium Issues | 3 findings

Pending

#1 medium Issue
Renouncing ownership before trading is enabled permanently bricks the token
MemeToro.sol
L36-44
Description

The contract inherits a function that lets the owner give up ownership by setting the owner to the zero address, and it does not guard or override it. Because opening trading is owner-only and is the only thing that can ever set the trading flag, renouncing ownership while the gate is still closed destroys the only mechanism that could ever open it. Every transfer between non-exempt addresses would then revert for the rest of the contract's life, with no recovery at all - the contract is not upgradeable, there is no timelock escape, and there is no admin recovery role. Two things make this more than a theoretical concern. Renouncing ownership is a step many token teams deliberately take shortly after deployment to show they cannot interfere, so a team following that convention here would destroy their own token. And the live contract is in exactly the vulnerable state right now, with trading still closed. Addresses already on the exemption list would keep their bypass, so the former owner could still move its own tokens, but no ordinary holder could ever transact and no liquidity pool could ever function.

Pending

#2 medium Issue
Launch control and the majority of supply sit on a single externally owned account
MemeToro.sol
L8
L36
L46
Description

Every administrative capability is bound to one owner address, and we confirmed on-chain that this address is an ordinary externally owned account - it has no contract code and a transaction count of sixteen, so it is not a multisig. There is no timelock, no delay, no separation of duties, and no on-chain governance. The same address also holds about 65.75 percent of the total supply, so a single private key controls both whether the market ever opens and the majority of the float. One key compromise, loss, or misuse is enough to withhold the launch indefinitely, permanently brick the token by renouncing ownership, hand selective pre-launch trading rights to chosen addresses, or sell the majority of supply into whatever liquidity exists at launch, with nobody able to delay or veto any of it. What meaningfully bounds the damage is that the key holder still cannot create, destroy, or seize tokens - those functions simply do not exist in the contract.

Pending

#3 medium Issue
Trading is disabled on the live contract and only the owner can ever open it
MemeToro.sol
L10
L26-34
L36-44
Description

Every token movement passes through an overridden update function that blocks the transfer unless one of the two parties is on an exemption list or the trading flag has been set. The flag starts out false and the only thing that can set it is an owner-only function. There is no deadline, no automatic unlock after some block or timestamp, no community override, and no other code path that touches the flag. This is not a hypothetical: reading the live contract shows trading still disabled while the full supply has already been created, the owner holds about 65.75 percent of it, and roughly 34 percent - around 411 million tokens - sits with other addresses that are not on the exemption list. No transfer between two non-exempt addresses can succeed. Those holders are not completely immobilised, because the check passes when either side is exempt, so they can still send to the owner, to the conventional dead address, or to the token contract itself - but all three of those are one-way sinks that destroy or donate the position rather than let anyone realise value, and none of them can be reached in reverse. In practice a holder can give the tokens away or burn them, but cannot sell them, cannot reach another ordinary holder, and cannot even move them to a second wallet they control. There is no liquidity pool on either major decentralised exchange version, so there is no market either. From a buyer's point of view this is the defining trait of a possible honeypot: acquiring the token does not give you the ability to dispose of it for value, and whether you ever can is entirely at one party's discretion with no time limit. If the key is lost the restriction becomes permanent; if it is compromised, an attacker can withhold the launch indefinitely or open it at a moment of its choosing while holding the majority of supply.

low Issues | 5 findings

Pending

#1 low Issue
Owner can selectively open and close an early market before launch
MemeToro.sol
L46-50
Description

The exemption setter lets the owner turn the transfer bypass on or off for any address at any time, with no restriction and no cooldown. The bypass is needed for a legitimate reason - the owner has to be able to seed a liquidity pool before the public launch - but it is unconstrained, and because the check passes when either side of a transfer is exempt, the choice of which address to exempt decides who gets a market. There are two quite different levers. Exempting the pool itself opens a general early market rather than a private one: every buy passes because the sender is exempt and every sell passes because the recipient is exempt, so any address at all can trade against that pool, including addresses the owner has never touched. Exempting one individual while leaving the pool alone is the genuinely exclusive lever: only that address can trade with the pool in either direction, and every other holder is refused. Either lever can be withdrawn at any time, so an early market can be opened and shut at will. Once trading is enabled the flag no longer matters, because the launch condition is already satisfied, so the exposure is confined to the pre-launch window - which is the window the token is in right now.

Pending

#2 low Issue
Ownership transfer is single-step with no confirmation from the recipient
MemeToro.sol
L8
Description

The contract uses the basic ownership module rather than the two-step variant, so transferring ownership takes effect immediately and the recipient never has to confirm it. The only check is that the address is not zero. In most tokens a mistyped ownership transfer is survivable because the token keeps working. Here it is not: while trading is still disabled, handing ownership to an address whose key nobody controls has the same effect as renouncing it - the launch gate can never be opened and the token is frozen for good.

Pending

#3 low Issue
Exclusion flags are not kept in sync when ownership changes
MemeToro.sol
L19
L46-50
Description

The constructor grants the transfer bypass to whoever deploys the contract, and nothing keeps that flag in step with the owner variable afterwards. Once ownership is transferred, the former owner keeps its bypass and can still move tokens freely while ordinary holders are frozen, even though it no longer holds any administrative role. The incoming owner, meanwhile, has no bypass and cannot transfer until it whitelists itself - which it can do, so that half corrects itself. The lingering privilege on the old address is the real issue: somebody reading only the owner field would have no reason to suspect it exists.

Pending

#4 low Issue
Tokens sent to the contract address can never be recovered
MemeToro.sol
L21
Description

The constructor puts the contract's own address on the exemption list, which means transfers into the contract always succeed, even before launch. But nothing can ever move a balance back out: there is no rescue, sweep, or withdraw function, and the deployed code contains no instruction for calling another contract at all, so it cannot even interact with a token contract. Anything that reaches this address is frozen permanently. The exemption also serves no purpose in the current design, since no code path ever needs the contract to hold tokens - it looks like leftover boilerplate from fee-taking token templates where the contract genuinely does accumulate a balance. Native currency is not at risk, because the contract has no payable entry point at all.

Pending

#5 low Issue
The launch transaction can be front-run, with no anti-sniping protection
MemeToro.sol
L36-44
Description

Opening trading is a public state change with immediate economic value: the moment it lands, a token that could not be traded becomes tradeable. That transaction is visible in the mempool before it is included, and there is nothing in the contract to protect the launch block. There is no cap on transaction or wallet size, no cooldown, no per-block purchase limit, and no anti-bot logic. Approvals are deliberately not covered by the transfer gate either, so anyone can pre-approve a router in advance, which reduces the cost of a sniping attempt to a single swap. Automated searchers can therefore land in the same block as the launch, take a large share of the opening liquidity, and sell into later organic demand. The cost falls on ordinary participants through worse execution rather than on the contract itself, and this is largely inherent to public launches.

optimization Issues | 3 findings

Pending

#1 optimization Issue
Reorder the transfer guard so it short-circuits on the trading flag
MemeToro.sol
L27-31
Description

The guard works out whether either party is exempt before it looks at the trading flag, and it does so unconditionally. That means an ordinary transfer after launch, between two addresses that are not on the exemption list, pays for two cold storage reads whose result cannot possibly change the outcome - once the flag is set the guard passes regardless. Because the flag is permanently set after launch, this cost is paid on every single transfer for as long as the token exists. Putting the flag test first lets the compiler skip both storage reads in the common case. We measured the difference on a post-launch transfer: 43798 gas as written against 39383 gas reordered, a saving of 4415 gas or 10.1 percent per transfer.

Pending

#2 optimization Issue
Compute the initial supply at compile time instead of at deployment
MemeToro.sol
L23
Description

The initial supply is worked out at deployment time by calling the decimals function, raising ten to that power, and multiplying, even though the result is fully known when the contract is compiled. This costs a function call, an exponentiation, and a multiplication during construction. The saving is one-off and affects deployment cost rather than per-transfer cost, but a named constant is also clearer than a long inline literal and removes a magic number from the code.

Pending

#3 optimization Issue
Skip the storage write when the exemption flag is unchanged
MemeToro.sol
L46-50
Description

The exemption setter writes to storage unconditionally. Setting an address to the value it already holds still performs a storage write, costing roughly 2900 gas for a no-change write to an already-touched slot and more if the slot is cold, and it still emits the change event. Checking the current value first reduces the redundant case to one storage read and an early return.

informational Issues | 9 findings

Pending

#1 informational Issue
Exemption setter performs no input validation
MemeToro.sol
L46-50
Description

The setter accepts any address, including the zero address, and writes to storage even when the stored value already matches the new one. The practical consequences are limited - exempting the zero address has no effect in the current code because neither creation nor destruction of tokens is reachable, and a redundant write only wastes gas. The one real downside is that a no-change write still emits the change event, so anything tracking the exemption list off-chain can be shown any number of notifications that correspond to no actual change.

Pending

#2 informational Issue
The zero address is missing from the exemption list, a trap for future changes
MemeToro.sol
L19-21
Description

The constructor exempts the owner, the conventional dead address, and the contract itself, but not the zero address. In the underlying token implementation, creating tokens is represented as a transfer from the zero address and destroying them as a transfer to it, so both would be checked against the launch gate. In the contract as deployed this is harmless and cannot be reached: the single creation happens in the constructor and deliberately calls the base implementation directly, bypassing the override; no function exposes destruction; and ordinary transfers reject the zero address on either side. The concern is forward-looking. If a burn capability or any minting is ever added, it would fail with the trading-disabled error whenever the gate is closed and neither party is exempt - a confusing failure whose cause sits several inheritance levels away from the new code.

Pending

#3 informational Issue
Constructor creates the supply through the base implementation instead of the standard path
MemeToro.sol
L23
Description

The initial supply is created by calling the base implementation directly rather than through the standard minting helper. This skips both the contract's own transfer gate and the helper's guard against a zero-address recipient. Neither omission is harmful as written: the ownership module already rejects a zero initial owner, so the recipient is guaranteed valid, and the gate would have allowed the operation anyway because the owner is exempted on the line just above. The event emitted is correct, so explorers and indexers interpret the creation properly. What it costs is maintainability - a reader has to reason across three levels of inheritance to be sure the operation is safe, and a future edit that reordered the constructor, for instance exempting the owner after the mint rather than before, would silently change behaviour.

Pending

#4 informational Issue
An overridable function is called from the constructor
MemeToro.sol
L23
Description

The supply calculation calls the decimals function during construction. This contract does not override that function, so it resolves to the inherited constant of eighteen and the result is correct, which we confirmed against the live total supply. Calling overridable functions from a constructor is nevertheless a known hazard: if a future subclass were to override decimals to read stored state, that state would not yet be initialised at construction time and the supply would be computed from a zero value.

Pending

#5 informational Issue
No documentation comments anywhere in the contract
MemeToro.sol
L1-51
Description

The contract carries no documentation comments at all - no title, no descriptions, no parameter or return documentation on any member, including the two privileged functions and the override that implements the token's only non-standard behaviour. Nothing records the intent of the launch gate, the meaning of the exemption list, or the fact that the trading flag is deliberately one-way. For a token whose principal risk characteristic is a transfer restriction, this matters: an integrator reading the source has no statement of intended behaviour to check the implementation against, and holders cannot easily tell a temporary launch gate apart from a permanent restriction.

Pending

#6 informational Issue
Event and state variable names differ only by capitalisation
MemeToro.sol
L10
L15
Description

The state variable and the event that reports it changing are spelled the same apart from the leading capital letter. They are separate identifiers as far as the compiler is concerned and nothing is shadowed, but in review, in log output, and in generated client bindings the two are easy to mix up, and some binding generators produce awkward or colliding names for such pairs. The event also carries no parameters, so a log entry records that trading was opened but nothing about when or by whom beyond what the surrounding transaction implies.

Pending

#7 informational Issue
Standard token approval race condition is not mitigated
MemeToro.sol
L8
Description

Setting an allowance overwrites the previous value rather than requiring the old one to be supplied. A spender that notices a pending transaction lowering its allowance can get in first with a transfer for the old amount and then spend the new amount as well. This is inherent to the token standard and is present in the current version of the underlying library, which deliberately removed the incremental allowance helpers, so we report it for completeness rather than as a defect specific to this contract. Worth noting that approvals are not covered by the launch gate, so allowances can be set while trading is still closed, though the transfer they enable would still be blocked.

Pending

#8 informational Issue
Dependency files use permissive compiler version ranges
MemeToro.sol
L3
Description

Five different compiler version constraints appear across the files that make up this build. The audited contract pins an exact version, while the library files use open-ended ranges, some going back to very old compilers. Analysis tooling then reports every historical compiler bug reachable anywhere within those ranges. None of these are real exposures for this deployment: the audited file pins one exact version, the deployment used that version, and we confirmed the deployed code is an exact match for a recompilation with it, so the code on-chain was produced by exactly one known compiler. The open ranges in the library interface files are a deliberate practice by that library to maximise compatibility for consumers. We separately checked the official bug list for the compiler version actually used and confirmed that both entries affecting it are inapplicable here - one requires a code-generation pipeline this build did not use together with recursive functions, and the other requires storage laid out beyond the end of the address space.

Pending

#9 informational Issue
After ownership is renounced, the zero address formally satisfies the owner check
MemeToro.sol
L8
Description

Formal analysis of the renouncement behaviour produced a case where the caller is the zero address. The reason is that renouncing ownership sets the owner to the zero address, after which the owner check compares the caller against that value and is satisfied whenever the caller is itself the zero address. Formally, the zero address becomes the owner. This cannot happen on-chain, because the execution environment never presents the zero address as the caller of a transaction or an internal call, so no transaction can exercise it. We record it because it is a genuine property of the code that a reviewer or an automated prover will run into, and because it means the renounced state is not formally ownerless, only practically so.