As of 3 Nov 2026, UVToken has 2 audit reports by 1 security firm on Trustblock; the latest is by CertiK, dated 24 Feb 2023. Those reports list no open critical findings. It also holds 1 deployed contract on 1 chain.
Record last updated . It holds audits, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.
Newest first
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 1 |
| High | 1 | 0 | 1 |
| Medium | 0 | 2 | 4 |
| Low | 8 | 2 | 6 |
The UvToken Android application logs highly sensitive wallet information such as private and public keys as well as different endpoints. By connecting an Android device to a PC, log output from the wallet application applications can be obtained with "adb logcat". It is important that applications do not send sensitive information to log output. The following screenshot shows a private key logged in the Android logcat: 
Open the reportIn the current implementation, function `InsertUVTPledge` will trigger an external call to a user provided address `_pledgeAddr`. ```solidity=422 function InsertUVTPledge( address _userAddr , uint256 _pledgeAmount, address _pledgeAddr ) external { IPledge IPledge_ = IPledge(_pledgeAddr); bool _isValid; (,,,_isValid) = IPledge_.getPledgeInfo(); require(_isValid,"noValid"); payToken(tokenAddress_, _userAddr, _pledgeAmount); IPledge_.insertUVTPledge(_userAddr, _pledgeAmount); } ``` Calling a user provided address is dangerous, especially in a public function with no access control restriction. An attacker could deploy a malicious contract and use the vulnerable function to trigger a call to the malicious contract. In this case, the attacker can bypass the `_isValid` check in L426 and he can transfer tokens hold by any user to the `IFinance_` account, if the user has approved the `UVTPledge` contract.
Open the reportThe implementation of the `isNotContract` check can not cover all scenarios. The check can be bypassed if the call is from the constructor of a smart contract or when the contract is destroyed. In that case, the codesize will also be zero. The "isContract" function in the OpenZeppelin "Address" library uses the similar implementation, but comments mention that "it's unsafe to rely on the check and it can be bypassed". Reference: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol Bypassing the `isNotContract()` check would introduce potential risks to the project.
Open the reportThe "mint" function lacks access control, allowing any user to call it and transfer uvcToken to miner on a daily basis. The reason for allowing everyone to call the "mint" function is unclear to the auditor and we suggest this function should only be accessible from the contract owner. ```solidity=474 function mint() external CanMint isNotContract(msg.sender) returns(bool) { uint256 nDays = (block.timestamp - lastMint_)/CYCLE_; lastMint_ = lastMint_ + nDays * CYCLE_; uvcToken_.safeTransfer(miner_, nDays * numMint_); return true; } ```
Open the reportThe mnemonic phrase is a list of words that can be used to recover a wallet account. Obtaining the mnemonic can potentially allow the attacker to gain full control of the wallet. The application neither has a mechanism in place to stop a user from taking the screenshot of the displayed wallet secrets nor display a warning to remind the user of the risk of taking a screenshot. 
Open the reportThe currently implemented password policy is permissive regarding the requirements related to the password, as it let the user set a weak password such as `Test1234`.
Open the reportMultiple Solidity versions are used in the codebase. Versions used: `^0.8.4`, `^0.8.7` `^0.8.4` is used in UVToken/uvcMine.sol file. ```solidity=305 pragma solidity ^0.8.4; ``` `^0.8.7` is used in UVToken/uvcMine.sol file. ```solidity=404 pragma solidity ^0.8.7; ```
Open the reportThe application does not implement certificate pinning. Certificate pinning is the act of associating a host with its expected certificate within the application. When the application connects to the host, the stored certificate is compared to the certificate held by the remote host. If the two certificates do not match, the request is dropped. Currently, the application only verifies that the server presents a TLS certificate that is trusted by the Android or iOS trust stores, not validating that the TLS certificate is in fact the one known to be deployed on the servers.
Open the reportConnections to internal hosts or testing domains such as the ones shown below were observed during the testing: ```http POST /wallet/subscription/coin HTTP/1.1 Host: 192.168.0.110:8008 Content-Type: application/json Connection: close Accept: */* User-Agent: Blockchain Wallet/1.4.1 (iPhone; iOS 14.5.1; Scale/2.00) Accept-Language: en-ES;q=1, es-ES;q=0.9 Content-Length: 1034 Accept-Encoding: gzip, deflate ``` ```http GET /v1/accounts/bi/detail/find HTTP/1.1 Host: wallet-test.uvtoken.org User-Agent: Blockchain Wallet/1.4.1 (iPhone; iOS 14.5.1; Scale/2.00) Accept: */* Accept-Language: en-ES;q=1, es-ES;q=0.9 Accept-Encoding: gzip, deflate Connection: close ``` It is believed that they were part of the testing and/or debugging process.
Open the reportDuring the test, it was found that the HTTP response from the server contains the CORS header `Access- Control-Allow-Origin: *`.
Open the reportThe version of the jQuery JavaScript library used by the UvToken web service was outdated and even contained known vulnerabilities. Specifically, the version in use was 2.0.0.
Open the reportThe remote service accepts connections encrypted using TLS 1.0. TLS 1.0 has a number of cryptographic design flaws. Modern implementations of TLS 1.0 mitigate these problems, but newer versions of TLS like 1.2 and 1.3 are designed against these flaws and should be used whenever possible. As of March 31, 2020, Endpoints that aren’t enabled for TLS 1.2 and higher will no longer function properly with major web browsers and major vendors. PCI DSS v3.2 requires that TLS 1.0 be disabled entirely by June 30, 2018, except for POS POI terminals (and the SSL/TLS termination points to which they connect) that can be verified as not being susceptible to any known exploits.
Open the report| Address | Chain | Source code |
|---|---|---|
| 0xa9bd…85690xa9bdd634725eab26ab297e969071fadc45118569 | Chain: BNB Chain | Source code: Verified source |
Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.
Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.
<head><script src="https://widget.trustblock.run/project-widget.min.js" defer></script></head><body><divdata-tb-project-widgetdata-tb-project-slug="uvtoken"></div></body>
Paste the code where the label should appear. It uses no API credit and updates by itself.
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