As of 3 Nov 2026, Hinkal has 2 audit reports by 2 security firms on Trustblock; the latest is by Zokyo, dated 20 Feb 2024. Those reports list no open critical findings.
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
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Hinkal | Security firm: Zokyo | Date: | Scope: Not recorded (see the report) | No open critical findings | Open · IPFS |
| Hinkal Protocol | Security firm: Quantstamp | Date: | Scope: Files named in the report | No open critical findings | Open · certificate.quantstamp.com |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 0 | 4 |
| Medium | 1 | 2 | 5 |
| Low | 0 | 3 | 32 |
Some contracts restrict critical operations to an `owner` role. The owner of the `VerifierFacade` contract controls the registered verifier contracts used for verifying ZK proofs. If the owner is compromised, the attacker can register a malicious contract that always returns `true` regardless of input. As a result, the ZK proof verification is disabled, and the attacker can claim that they own a commitment belonging to other users and transfer the funds to themselves. An overview of all privileged roles is as follows: **The contract `AccessToken.sol` gives the following privileges:** 1. The address `owner` can update the minting fee to an arbitrary value via the function `setMintingFee()`. 2. The address `owner` can blacklist an access key by removing it from the current Merkle Tree, via the function `blacklistAccessKey()`. After that, the blacklisted access key will not be able to submit a transaction to Hinkal. 3. The address `owner` can blacklist an address via the function `blacklistAddress()`. After that, the blacklisted address will not be able to add a new access token to Hinkal or to call the function `HinkalBase.register()`. 4. The address `owner` can remove an address from the blacklist via the function `blacklistAddress()`. 5. The address `owner` can withdraw all native tokens owned by the contract which represents the fee to mint an access token via the function `withdraw()`. 6. The address `owner` is used to authorize via a signature a new access token before it is added to the system via the function `addToken()`. **The contract `ERC20TokenRegistry.sol` gives the following privileges:** 1. The address `owner` can enable or disable the usage of the contract as a filter of ERC20 tokens in Hinkal transactions via the function `changeState()`. 2. The address `owner` can add a new token address to be supported for Hinkal transactions via the function `addERCToken()`. 3. The address `owner` can remove a token address to be supported for Hinkal transactions via the function `removeToken()`. 4. The address `owner` can set a limit to the amount of tokens that can be spent for a given token address in a Hinkal transaction via the function `setTokenLimit()`. **The contract `Hinkal.sol` gives the following privileges:** 1. The address `owner` can register an external action to be supported for Hinkal transactions via the function `registerExternalAction()`. After that, the address will be whitelisted and it will be possible to make an external call to that address in `Hinkal_internalRunExternalAction()`. 2. The address `owner` can revoke an external action to be supported for Hinkal transactions via the function `removeExternalAction()`. After that, it will be possible anymore to make an external call to that address in `Hinkal_internalRunExternalAction()`. **The contract `HinkalBase.sol` gives the following privileges:** 1. The address `owner` can register an arbitrary address to be the new `hinkalHelper` via the function `setHinkalHelper()`. After that, the result of core flows in the protocol can change based on the code of that new contract, since it stores: * The list of all registered access tokens; * The list of allowed relayers; * The list of allowed tokens, with their associated maximum limit; **The contract `RelayStore.sol` gives the following privileges:** 1. The address `owner` can update the relayer fee to a value between `0` and `500`, which means between `0` and `5%` via the function `setRelayPercentage()`. 2. The address `owner` can remove a relayer via the function `removeRelay()`. 3. The address `owner` can add or update an existing relayer via the function `addOrSetRelay()`. The relayer has two attributes: a `URL` and a `priority`. **The contract `VerifierFacade.sol` gives the following privileges:** 1. The address `owner` can add a new verifier contract based on its address and identified by a given ID to be supported by the contract via the function `registerVerifier()`. 2. The address `owner` can remove a verifier contract identified by a given ID to be supported by the contract via the function `removeVerifier()`.
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="hinkal"></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