Audit · firm’s term: audit report
QuillAudits reviewed Central African Republic Meme (Car Coin) on 21 Apr 2025: 4 findings, 0 critical; 3 marked fixed, 1 open.
Report hosted on quillaudits.com.
Trustblock does not review code.
Statuses are the security firm’s own, from its report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 1 | 0 | 2 |
| Medium | 0 | 0 | 1 |
| Low | 0 | 0 | 0 |
This contract is designed so that land can only be purchased using a message signed by a trusted authority (like an admin or backend service). To enforce this, it defines an AUTHORITY address that's supposed to represent the signer. But instead of setting it to a real address, the contract sets AUTHORITY = address(0), which is just an empty placeholder.address constant private AUTHORITY = address(0); On top of that, the line that checks if the signer of the message actually matches this AUTHORITY is commented out. This means the contract does not validate who signed the message — anyone can pass in a fake message with any signature, and the contract won’t stop it.
This contract handles land sales where users can buy land using an off-chain signed message. The buy function is supposed to verify that the message was signed by a trusted authority before allowing the purchase. However, the check is broken: it usesassert(isSignatureValid || !isSignatureValid);, which is always true. This means anyone can call buy with a fake or random message and still purchase land. The purpose of using off-chain signatures for permission is completely defeated.
The land sale contract relies on off-chain signatures to authorize purchases. Each signed message includes a timestamp, but the contract currently does not enforce any strict freshness checks. The timestamp is only weakly verified with a placeholder condition:assert(block.timestamp > timestamp); This means any previously signed message can be reused indefinitely, as long as the current time is after the message’s timestamp. This opens the door for replay attacks, where a buyer can submit the same message multiple times. This issue becomes critical when combined with the earlier fix we suggested—to allow land to be re-purchased after expiration by checking if block.timestamp > land.expiresAt. While this fix enables proper land reuse, it also means that without replay protection, a buyer can simply reuse an old signature with a previously agreed-upon price and expiration date. This allows them to bypass any updated pricing or terms, undermining the purpose of having dynamic pricing or rental durations.
The report names a repository or files. Open the report to see its scope.
Repository and files the report names (3)
350 projects reviewed · 459 reports · latest Apr 2025
See QuillAudits’s auditsSomething 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