Wemix Retainer 150 WEMEME

CertiKFiles named in the report

Audit

Part of CertiK’s retainer series

CertiK reviewed WEMIX (Wemix Retainer 150 WEMEME) on 13 Feb 2025: 13 findings, 0 critical; 7 marked fixed, 6 open.

No open critical findings
Open the reportOpen WEMIX’s security record

Report hosted on skynet.certik.com.

Trustblock does not review code.

Findings13

Statuses are the security firm’s own, from its report.

SeverityOpenAcknowledgedFixed
Critical000
High101
Medium100
Low406
HighLack of Transfer Restriction Before Complete CoulFixed

The `WEMEME` token inherits the standard `ERC20` contract, which does not have any transfer restriction. If a user purchases the `MEME` token via the bonding curve, he could create a token pair via `playSwapRouter` between the `MEME` token and Wemix using any arbitrary ratio between the two tokens, even before the bonding curve's wemix reserves and token holder count reach their thresholds. This effectively determines the price between the two tokens on the `playSwapRouter`. When the wemix reseves and token holder count do reach the threshold, the `_complete()` function would add liquidity to the token pair at the price determined by the `playSwapRouter` and the corresponding token pair contract, which could be very different from the price of the bonding curve (i.e. the price of `WEMEME` token could be higher via `playSwapRouter` than via the bonding curve). With the price discrepancy, the original liquidity provider of the token pair, or other buyers of the `WEMEME` token via the bonding curve, could potentially sell large amount of `WEMEME` token immediately after the token is "complete" on the bonding curve and profit off of the price discrepancy and extract a large portion of WEMIX token from the token pair.

LowChecks Effects Interactions Pattern Not UsedFixed

The `buy`, `sell`, and `complete` functions of the `WEMEME` contract do not follow the checks-effects-interactions pattern, as token transfers including native token transfers take place before the relevant state variables are updated. In normal circumstances, these functions are called via the `Router` contract which contains the `nonReentrant` modifier, which offers the necessary reentrancy protection. However, the `router` address could theoretically be changed via the `WEMEMEpolicy` contract. If a new `router` contract does not contain reentrancy protection, the deviation from the checks-effects-interactions pattern could become a vulnerability. For example, the creator fee recipient could potentially reenter the `complete` function and receives fee multiple times.

LowEvent Not IndexedFixed

If an event is not indexed in a smart contract, it means that the event's parameters are not tagged with the `indexed` keyword. This has implications for how the event data can be searched and filtered when looking through blockchain logs. Without indexing, the event will still emit the data as part of the transaction log, but users won't be able to query for these events using the parameters. They'll have to retrieve the entire set of logs and manually sift through them to find events with the specific data. This can be less efficient and more time-consuming, especially on a blockchain with a high volume of transactions and events.

LowMissing Emit EventsFixed

There should always be events emitted in the sensitive functions that are controlled by centralization roles.

LowMissing Input ValidationsFixed

The variables `wemixThreshold`, `listingFee`, and `creatorIncentive` should satisfy the condition that `wemixThreshold >= listingFee >= creatorIncentive` (or `>`). However, only the `setCreatorIncentive()` function contains input validation, and the `setListingFee()` and `setWemixThreshold()` functions do not. If these parameters are not set correctly, the `_complete()` function of `WEMEME` could potentially always revert due to underflow.

LowMultiple Inheritance of Ownable ContractFixed

The `WEMEME` contract inherits both `Ownable` and `WEMEMEBase` contracts. The `WEMEMEBase` contract inherits `WEMEMERole` contract which also inherits `Ownable` contract.

LowPotentially Stuck Native TokensFixed

The `WEMEME` and `WEMEMERouter` contracts contain payable `receive()` and `fallback()` functions, but other than fee payment and liquidity provision which have their own accounting records, no other mechanism to retrieve native tokens sent to the contract.

Contracts in scope

No deployed address is recorded for this audit.

The report names a repository or files. Open the report to see its scope.

Repository and files the report names (12)

  • token/IWEMEME.sol
  • token/BondingCurve.sol
  • IWEMEMEEvent.sol
  • factory/IWEMEMEFactory.sol
  • factory/WEMEMEFactory.sol
  • WEMEMERouter.sol
  • policy/IWEMEMEPolicy.sol
  • base/WEMEMEBase.sol
  • policy/WEMEMEPolicy.sol
  • token/WEMEME.sol
  • base/WEMEMERole.sol
  • token/IBondingCurve.sol

Part of WEMIX’s security record

WEMIX
Audits75 audits by 1 firmLast audit Feb 2025, by CertiK.
Critical findingsNo open critical findingsAcross the 75 reports, 17 critical findings were reported. Each is marked fixed by the firm that reported it.
Open WEMIX’s security record

Security firm

CertiK

1,044 projects reviewed · 1,375 reports · latest May 2025

See CertiK’s audits

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us