HCOW Info

HCOW is a GameFi ecosystem built around one idea: games should be provably fair, and the value they create should flow back to the people who play and hold.

HCOW Logo

Team and KYC Verification

The team has securely submitted their personal information to SolidProof.io for verification.

In the event of any fraudulent activities, this information will be promptly reported to the relevant authorities to ensure accountability and compliance.

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.

98.63
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

Select the audit
"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/08/28
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.

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

Re-audit Scope

This statement replaces the one issued on 28 August 2026 and covers the faucet contract as it stands at the pinned commit. The contract grew from two hundred and sixty eight lines to three hundred and thirty eight, with eighty two lines changed. All five findings from the first round were re-verified against the new source. No new findings are recorded.

Contract Analysis

The faucet hands out test HCOW and test USDT on BNB Chain testnet, one claim per address per day, so that a person can actually try bonding and claiming rather than only looking at a dashboard. It dispenses stand-in tokens which have no value. There is no mint path of any kind, so the faucet can only give away what was put into it and a defect here cannot inflate anything. It does not dispense gas, which is the right choice, because calling the claim function already requires gas and a faucet that paid for gas could never be reached by the person who needs it.

Two changes since the first round. The status view now reports the two amounts the caller would actually receive at that moment, alongside the count of complete allowances remaining, so an interface can distinguish the two rather than disabling a button on a figure the contract would have honoured. And ownership transfer is now two step with an explicit cancel, matching the other five contracts.

Ownership Privileges

The owner holds unrestricted control over the faucet balance, which is the correct design for a faucet that needs to recover tokens sent to it by mistake. The owner can:

  • Withdraw any token, in any amount, to any address
  • Set the two drip amounts, which cannot be set to zero
  • Reopen the global claim ceiling before its interval is up, which cannot be called when nothing has been claimed
  • Nominate a successor owner, who must accept, and withdraw that nomination

Restricting the withdrawal would achieve nothing while the drip amounts remain owner-settable, so the trust is stated in the material testers read rather than pretended away. Nothing of value is behind it.

Security Features

  • No mint path exists, so the faucet cannot inflate the stand-in tokens
  • The claim gate requires the caller to be the transaction origin and to have no code. Neither half is sufficient alone: code length is zero during a constructor, and the origin check is what closes deploying and claiming in one call. The reasoning behind this was corrected since the first round and is now accurate about the delegation mechanism that went live on the target chain: a delegated account is the origin of its own transaction and has code, so the two are no longer equivalent and the code length check is the load bearing half. We confirmed these are the only two uses of either primitive anywhere in either repository
  • Every piece of state is written before either transfer, so reentrancy is structurally impossible, and a token calling back would itself fail the origin check
  • The two token amounts are decided independently, so if one side is exhausted the claim still succeeds on the other. The cooldown is charged either way, which is correct: charging only on a full payout would remove the cooldown entirely in the state this faucet actually lives in, where one side running short is the steady state rather than an edge case
  • The shortfall comparison used to name which side is worse off cannot underflow, because reaching it requires both balances to be short
  • Neither drip amount can be set to zero, which also protects the divisions in the status view

Findings Summary

All five first-round findings were informational and none has produced a new one. Four are closed and one is acknowledged.

The acknowledged item is the global claim ceiling, which fresh addresses can capture as readily as genuine testers, converting a fast drain into a lockout that outlasts a refill. On a testnet faucet dispensing valueless tokens that is the documented rate limit behaving as intended, and the signed voucher gate we described should stay unimplemented while the campaign it would serve does not exist. The two observations worth keeping are now written into the source, so that nobody copying this pattern to a value-bearing deployment inherits it without also seeing the analysis: the ceiling converts a drain into a lockout, and the interval schedule is set by whoever claims first. The owner-only interval reset is a reasonable answer to the lockout without adding a signature scheme.

The two inaccuracies the first round found in the contract's own documentation are corrected, and both corrections are worth noting because they are the kind that usually go unmade. The withdrawal function's description said it recovers anything sent to the contract, which was untrue of native currency; it now says tokens only and records that native currency cannot arrive through an ordinary transfer but can be forced in, that anything arriving that way stays, and that nothing in the contract reads its own balance so it has no effect on behaviour. We checked all three statements against the source and all three hold. And the comment justifying the caller restriction predated the delegation mechanism and read as though caller equal to transaction origin means the caller is an ordinary account; it no longer says that.

Note - This Audit report consists of a security analysis of the HCOWFaucet smart contract. This contract is testnet only and dispenses stand-in tokens with no value. It should never be deployed alongside the real HCOW token. We recommend investors do their own research before investing.

Files and details

Findings and Audit result

informational Issues | 5 findings

Acknowledged

#1 informational Issue
Global claim ceiling can be captured by throwaway addresses, locking out real testers
HCOWFaucet.sol
L35-44
L136-142
L277-291
Description

The per-address cooldown is defeated by using fresh addresses, which the source comments correctly identify, and the global ceiling of two hundred and fifty claims per interval is positioned as the answer. The ceiling is consumed by those same fresh addresses, so it does not slow the drain so much as convert it into a lockout: a script funding two hundred and fifty new addresses takes the whole interval's allocation and every genuine tester is refused until it rolls. Because the interval is anchored to the first claim after the previous one expires, whoever claims first also controls the schedule. Severity reflects that this is a testnet-only contract dispensing valueless stand-in tokens, so nothing of value is at risk; the same pattern on a value-bearing deployment would be materially worse, which is worth stating because code gets copied. Peer review characterises this as the documented rate limit behaving as intended, and on a testnet faucet dispensing valueless tokens that is a fair reading, so it is recorded at this severity. The point worth keeping is that the ceiling converts a fast drain into a lockout that outlasts a refill, and that the interval schedule is set by whoever claims first.

Resolved

#2 informational Issue
Owner holds unrestricted control over the faucet balance
HCOWFaucet.sol
L293-306
Description

The withdrawal function accepts any token, any recipient and any amount, so the owner can empty the faucet in two transactions. This is the stated intent and it is the right design for a faucet that needs to recover tokens sent to it by mistake. The interval reset carries no cooldown of its own, so the global ceiling is not a limit against the owner at all, only against everyone else; that too is deliberate, since without a reset a filled interval would be a cheap denial of service that outlasts a refill. Neither grants the owner anything it does not already have. One small inaccuracy: the documentation says the function recovers anything sent to the contract, but there is no path to recover native currency, which can still be forced in.

Resolved

#3 informational Issue
Cooldown is consumed on a partial payout and the status view can disagree with it
HCOWFaucet.sol
L149-183
L201-261
Description

The two token amounts are decided independently, so if one side is exhausted the claim still succeeds on the other and the full cooldown is charged. Charging unconditionally is the right choice, because charging only on a full payout would remove the cooldown entirely in the steady state, and because the configured ratio makes one side running short the expected condition rather than an edge case. The related point is that the status view reports how many complete allowances remain, so it reads zero while a claim would still succeed with a partial payout; an interface that disables the button on that figure will block claims the contract would honour.

Resolved

#4 informational Issue
Caller restriction and reentrancy posture verified
HCOWFaucet.sol
L107-134
Description

The claim gate requires the caller to be the transaction origin and to have no code, which was checked against several bypasses. A delegated account under the newer account-abstraction mechanism stores a short designator as its code, so it is correctly blocked; a contract cannot pass the origin check even while its code is still empty during construction; and a sponsored delegated transaction fails the origin check. State is written before both transfers, and reentrancy is structurally impossible in any case, because a token calling back would itself fail the origin check. The counters the contract keeps are monotonic and none of them gate value beyond the cooldown that has already been written. The shortfall comparison used to decide which side is worse off was checked for underflow and cannot underflow, because reaching it requires both balances to be short. There is no way found to make the faucet unusable through the amount setter, since both values are required to be non-zero and that also protects the divisions in the status view.

Resolved

#5 informational Issue
Ownership transfer completes in a single step
HCOWFaucet.sol
L308-337
Description

Ownership moves immediately with no confirmation from the incoming address. A mistyped address ends the ability to adjust the drip amounts, reset the interval or recover the remaining balance. Claims continue to work until the balance is exhausted, after which the remainder is unrecoverable.