As of 25 Oct 2026, Zoksh Pay has 1 audit report on Trustblock, by QuillAudits, dated 10 Jul 2023. That report lists no open critical findings.
Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Zoksh | Security firm: QuillAudits | Date: | Scope: Files named in the report | No open critical findings | Open · quillaudits.com |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 2 | 0 | 1 |
| Medium | 2 | 0 | 1 |
| Low | 10 | 0 | 2 |
In contract GatewayRoute the merchants are able to take their share of fare by calling the settle() function. The other function refund() is used for refunding the users if the wrong purchase was made or for some reason where the user/customer didn’t like the product. But the merchant can pass his other address as the recipient to take all the money which allows the merchant to bypass Zoksh’s fees.
Open the reportIn contract GatewayRoute the merchants are able to take their share of fare by calling the settle() function. The other function refund() is used for refunding the users if the wrong purchase was made or for some reason where the user/customer didn’t like the product. But the merchant can pass his other address as the recipient to take all the money which allows the merchant to bypass Zoksh’s fees.
Open the reportThe GatewayFactory contract has the variable setFee initialized to 100. From the calculations in _settle() on L112 this would cause 100% of the amount to be deducted as fees, this way preventing the merchant from withdrawing any amounts and transferring all tokens to the gatewayAddr.Currently in the setFee() function the admin can pass in any value to adjust the fee and the merchant uses confirmFee() to accept the adjusted fee variable. If the fee set is much higher than expected, it can limit user interaction with the protocol.
Open the reportIn GatewayRoute, function settle() and refund() send is used for transferring the ether. Future changes or forks in Ethereum can result in higher gas fees than send provides. The .send() creates a hard dependency on 2300 gas units being appropriate now but not in the future. This may also affect functionality when a multi-sig wallet is used for such interactions.
Open the reportFor ease of searching and the use of monitoring tools the following events in GatewayRoute can be indexed, PaymentSettled(), PaymentRefunded(), ManagerUpdated(). In the emission of events as well, there is no need to cast an address to payable.In GatewayFactory, the RouteCreated event has a 4th event topic without a name.
Open the reportFor ease of searching and the use of monitoring tools the following events in GatewayRoute can be indexed, PaymentSettled(), PaymentRefunded(), ManagerUpdated(). In the emission of events as well, there is no need to cast an address to payable.In GatewayFactory, the RouteCreated event has a 4th event topic without a name.
Open the reportFunctions with an external visibility modifier are not called directly in the contract and are cheaper than public functions are. For functions that are not to be called internally, it is best practice to make them external for gas savings.In GatewayRoute, getBlocked(), getManager(), getGatewayAddr() and getAdminContract() can be declared external. In GatewayAddress, getGatewayAddress() and getAdminContract() can be declared external.
Open the reportFunctions with an external visibility modifier are not called directly in the contract and are cheaper than public functions are. For functions that are not to be called internally, it is best practice to make them external for gas savings.In GatewayRoute, getBlocked(), getManager(), getGatewayAddr() and getAdminContract() can be declared external. In GatewayAddress, getGatewayAddress() and getAdminContract() can be declared external.
Open the reportThe naming convention used in the codebase is not clear and reduces the readability of the entire codebase. The terms manager and merchant are used concurrently but they could refer to different entities.In GatewayFactory, the onlyManager() modifier checks that the caller is the same as the merchantAddr address provided in the Administrable (GatewayAccess) contract. Since the check is for the merchant and not the manager, it can be changed to onlyMerchant(). In GatewayRoute, the onlyMerchant() modifier checks that the caller is the same as the managerAddr address provided in the creation of the GatewayRoute contract. Since the check is for the manager and not the manager, it can be changed to onlyManager().
Open the reportFrom GatewayFactory, the creation of a route can happen with createRoute() or deployRoute(). When routes are created using deployRoute() the merchant address and manager address are the same (msg.sender), but with createRoute() the manager can be any value passed in. The issue here is that the merchant no longer has the privileges to call onlyMerchant() functions if a separate manager is set when calling createRoute().
Open the reportIt is highly recommended to have above 95% of code functionality tested before going into production so as to catch bugs that could be introduced from user input as well as return values from function calls.
Open the reportIt is highly recommended to have above 95% of code functionality tested before going into production so as to catch bugs that could be introduced from user input as well as return values from function calls.
Open the reportSome variables declared in the GatewayFactory and GatewayRoute contracts are unused and can be removed to reduce the contract size and clean up the codebase. In GatewayFactory, the owner variable declared on L8 is unused. In GatewayRoute, the blocked boolean variable is unused as well.The SafeMath library is also imported into the GatewayRoute contract on L3 but is never used. merchantWhitelist() also has methods created around it but is unused as well. It would be expected that this whitelist is checked to make sure that merchant addresses are whitelisted before they are used in transactions.
Open the reportSome variables declared in the GatewayFactory and GatewayRoute contracts are unused and can be removed to reduce the contract size and clean up the codebase. In GatewayFactory, the owner variable declared on L8 is unused. In GatewayRoute, the blocked boolean variable is unused as well.The SafeMath library is also imported into the GatewayRoute contract on L3 but is never used. merchantWhitelist() also has methods created around it but is unused as well. It would be expected that this whitelist is checked to make sure that merchant addresses are whitelisted before they are used in transactions.
Open the reportThe reports name a repository or files. Open a report to see its scope.
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="zoksh-pay"></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