Indorse

QuillAuditsFiles named in the report

Audit · firm’s term: audit report

QuillAudits reviewed Indorse 2.0 Ecosystem (Indorse) on 1 Sep 2023: 18 findings, 0 critical; 10 marked fixed, 8 open.

No open critical findings
Open the reportOpen Indorse 2.0 Ecosystem’s security record

Report hosted on quillaudits.com.

Trustblock does not review code.

Findings18

Statuses are the security firm’s own, from its report.

SeverityOpenAcknowledgedFixed
Critical000
High100
Medium000
Low7010
LowConvert repeated code into a modifierFixed

The check (msg.sender == entrypoint) is used multiple times and can be converted into a modifier.

LowFunction visibility specifiers can be external instead of publicFixed

A number of externally facing functions in the codebase are declared public but are not called internally or cross-contract. If there is no chance to reuse these functions in an internal contract call (because external functions cannot be called within the same contract), as external functions are cheaper than public functions it would be beneficial to adjust the function visibility. In KillSwitchValidator.sol, ECDSAValidator.sol, ERC165SessionKeyValidator, MultiECDSAValidator, SessionKeyOwnedValidator, the functions (i) getAccountAddress() and (ii) validateSignature() can be declared external instead of public.

LowKernel can interact with an EOA instead of a contractFixed

In Kernel, it is expected that the execute() function is called with the target contract `to` being an external contract. The risk here is that an EOA can be delegatecalled or called and returns true as though it were a successful contract call. The execution fails to happen and there would be no reverts to show why.

LowMissing input validationFixed

There is no validation of the `to` addresses in the executeBatch() as well as the `tokenAddress` array of approveAndTransfer20Batch() of BatchActions.sol. If there is no check, transfers can go to address(0), value and data could also be zero values.

LowRedundant codeFixed

In the validateUserOp function in Kernel.sol, there is a redundancy found in variable assignment and declaration. It is unnecessary to initialize variables to the default value (e.g. uint256 i = 0), or to reassign the same variable to itself (unchanged) in the same function execution.In the Kernel.sol file, `op` is assigned the same value twice.

LowRisk of stuck funds in proxy contractsFixed

There is a slight discrepancy between the OpenZeppelin implementation and the EIP1967Proxy implementation, as msg.value is not checked. The check for msg.value is because when the data length passed is 0, it does not initiate the delegatecall to the logic contract and the value passed can get stuck in the contract.

LowSingle-step ownership transferFixed

The MultiECDSAKernelFactory utilizes the onlyOwner modifier inherited from the Ownable library. Functions in this contract with this modifier adjust key parameters in the entrypoint’s stake and the owners array. If the owner (from onlyOwner) is compromised, stake can be unlocked and withdrawn, or malicious users can be added to the `owners` array.

LowSolidity version incompatibilityFixed

The Kernel smart wallets are expected to be deployed on multiple EVM-based chains, some of which are Optimism, Arbitrum, Scroll, Linea, Polygon and Base) however solidity pramga versions above 0.8.19 may prove incompatible on chains like Arbitrum which do not support the PUSH0 opcode. To ensure the same deterministic bytecode is available across all chains, consider locking the pragma versions to 0.8.19.

LowUnchecked logic address in EIP1967 constructorFixed

The logic address passed in to the EIP1967 proxy is used to deploy new kernel accounts. Although this happens only once, when the proxy is deployed there is no check for address validity. An EOA can be passed into the constructor which will pass the delegatecall without reverting.

LowUnused interfaceFixed

IKernel is an empty interface declared and not used within the contract.

Contracts in scope

No deployed address is recorded for this audit.

The report names a repository or files. Open the report to see its scope.

Repository and files the report names (16)

  • src/validator/ECDSAValidator.sol
  • src/factory/KernelFactory.sol
  • src/factory/EIP1967Proxy.sol
  • src/executor/KillSwitchAction.sol
  • src/validator/ERC165SessionKeyValidator.sol
  • src/validator/SessionKeyOwnedValidator.sol
  • src/factory/MultiECDSAKernelFactory.sol
  • src/validator/KillSwitchValidator.sol
  • src/factory/ECDSAKernelFactory.sol
  • BatchActions.sol
  • src/executor/BatchActions.sol
  • src/validator/MultiECDSAValidator.sol
  • Kernel.sol
  • src/Kernel.sol
  • KillSwitchValidator.sol
  • ECDSAValidator.sol

Part of Indorse 2.0 Ecosystem’s security record

Indorse 2.0 Ecosystem
Audits1 audit by 1 firmLast audit Sep 2023, by QuillAudits.
Critical findingsNo open critical findingsIn 1 report.
Open Indorse 2.0 Ecosystem’s security record

Security firm

QuillAudits

350 projects reviewed · 459 reports · latest Apr 2025

See QuillAudits’s audits

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