Q1 2026 Security & Compliance Report44 incidents, $482M in losses, insights from 11 industry leaders.
Read the report

Audit name:

[SCA] Push Chain | EVM Gateway | Mar2026

Date:

Aug 4, 2025

Table of Content

Introduction
Audit Summary
System Overview
Potential Risks
Findings
Appendix 1. Definitions
Appendix 2. Scope
Appendix 3. Additional Valuables
Disclaimer

Want a comprehensive audit report like this?

Introduction

We express our gratitude to the Push Chain team for the collaborative engagement that enabled the execution of this Smart Contract Security Assessment.

Push Chain Gateway is a cross-chain interoperability protocol that bridges funds and payloads between external EVM chains and Push Chain. The protocol uses a TSS (Threshold Signature Scheme) relayer network to finalize transactions across chains.

Document

NameSmart Contract Code Review and Security Analysis Report for Push Chain
Audited ByOlesia Bilenka; Kornel Światłowski
Approved ByKhrystyna Tkachuk
Websitehttps://push.org
Changelog08/04/2026 - Preliminary Report
14/05/2026 - Final Report
02/06/2026 - Post Audit Changes
PlatformPush Chain, Ethereum
LanguageSolidity
TagsBridge; Centralization; Upgradable; Vault; Signatures
Methodologyhttps://docs.hacken.io/methodologies/smart-contracts
  • Document

    Name
    Smart Contract Code Review and Security Analysis Report for Push Chain
    Audited By
    Olesia Bilenka; Kornel Światłowski
    Approved By
    Khrystyna Tkachuk
    Changelog
    08/04/2026 - Preliminary Report
    14/05/2026 - Final Report
    02/06/2026 - Post Audit Changes
    Platform
    Push Chain, Ethereum
    Language
    Solidity
    Tags
    Bridge; Centralization; Upgradable; Vault; Signatures

Review Scope

Repositoryhttps://github.com/pushchain/push-chain-gateway-contracts
Commit0928967
Remediation commit4249311
Post Audit Changes80f7a20

Audit Summary

38Total Findings
28Resolved
6Accepted
4Mitigated

The system users should acknowledge all the risks summed up in the risks section of the report

Documentation quality

  • The project provides comprehensive documentation covering architecture, transaction flows, and security analysis. High-level architecture is described in 1_PUSH_CHAIN.md with clear actor definitions and component relationships.

  • Per-contract documentation (2_UniversalGateway.md, 3_UniversalGatewayPC.md) includes TXTYPE inference tables, rate-limit mechanics, fee models with worked examples, and sequence diagrams. Full outbound and inbound transaction flow documentation is provided in **4OutboundTxFlows.md** (covering all four categories: withdrawals, DeFi execution, CEA self-calls, and reverts with Mermaid sequence diagrams for each variant) and **5InboundTx_Flows.md**. Revert handling, threat modelling, and upgrade plans are documented separately.

  • NatSpec comments are present on most public and internal functions. Minor inconsistencies exist: the IUniversalCore interface in the gateway declares BASE_GAS_LIMIT() which does not exist on the actual UniversalCore implementation, and some line references in documentation do not match current code after remediation commits.

Code quality

  • The codebase properly reuses OpenZeppelin upgradeable libraries for access control, pausability, reentrancy protection, and safe ERC-20 operations.

  • Code duplication exists in both UniversalGateway and Vault, where identical transfer logic is copy-pasted with only the emitted event name differing.

  • Function naming and visibility conventions are inconsistent Mutable state variables use CONSTANT-style ALL_CAPS naming across all contracts.

  • The development environment is fully configured with Foundry, including profiles for CI, coverage, debugging, and fork testing.

Test coverage

Code coverage of the project is  76.61% (branch coverage).

  • Tests cover admin actions, all four transaction types (GAS, GAS_AND_PAYLOAD, FUNDS, FUNDS_AND_PAYLOAD), rate limiting (block-based and epoch-based), oracle integration, protocol fees, CEA-based inbound flows (58 tests), rescue operations, vault withdrawals, and vault token migration.

  • Fuzz tests are provided for protocol fee collection, rate limits, transaction routing, and vault invariants. The primary coverage gap is in UniversalGateway.sol branch coverage (70%) — uncovered branches include edge cases in Uniswap v3 pool discovery, concurrent multi-user rate-limit exhaustion, and certain L2 sequencer oracle failure paths.

System Overview

Push Chain Gateway is a cross-chain interoperability protocol that bridges funds and payloads between external EVM chains and Push Chain. The protocol uses a TSS (Threshold Signature Scheme) relayer network to finalize transactions across chains. The following contracts are in scope:

  • UniversalGateway — the primary inbound gateway deployed on external EVM chains (e.g., Ethereum, Arbitrum). It accepts user deposits of native ETH or whitelisted ERC-20 tokens and routes them to Push Chain. Supports four transaction types: pure gas top-ups, gas with payload execution, large-ticket fund transfers, and fund transfers with payload. Enforces per-transaction USD caps and per-block USD caps (via Chainlink ETH/USD oracle) for the instant gas route, and epoch-based per-token rate limits for the standard fund route. Supports ERC-20-to-native gas abstraction via Uniswap V3 swaps. Collects a flat native protocol fee on each inbound transaction. Provides revert and rescue paths for failed cross-chain transactions, callable only by the Vault. Uses OpenZeppelin UUPS-compatible upgradeability, access control (admin, TSS, Vault, pauser roles), pausability, and reentrancy guards.

  • Vault — the ERC-20 custody contract on external EVM chains. Holds bridged tokens and releases them on the destination chain upon TSS instruction. Routes all outbound executions through deterministic Chain Execution Accounts (CEAs) deployed via a factory. Supports three outbound operations: finalize (withdraw or execute via CEA), revert (refund failed inbound transactions), and rescue (recover stuck funds). All state-changing operations are restricted to the TSS role. Uses OpenZeppelin upgradeability, access control, pausability, and reentrancy guards.

  • UniversalGatewayPC — the outbound gateway deployed on Push Chain. Handles user-initiated transactions from Push Chain to external EVM chains. Burns PRC-20 synthetic tokens at request time, collects a protocol fee in native PC sent to VaultPC, and swaps remaining native PC to gas tokens via UniversalCore for cross-chain execution costs. Supports three outbound transaction types: funds only, funds with payload, and payload with gas. Also provides a rescue-funds flow for requesting release of stuck tokens on external chains. Uses OpenZeppelin upgradeability, access control, pausability, and reentrancy guards.

  • VaultPC — a simple fee custody vault deployed on Push Chain. Stores protocol fees collected from outbound transactions. Supports withdrawal of both native PC and PRC-20 tokens by a designated manager role. Uses OpenZeppelin upgradeability, access control, pausability, and reentrancy guards.

  • Types — shared library defining the transaction type enum (GAS, GASANDPAYLOAD, FUNDS, FUNDSANDPAYLOAD, RESCUE_FUNDS), revert instruction struct, multicall struct for CEA execution, packed epoch-usage struct for rate limiting, and signature verification types.

  • TypesUG — defines the inbound request structs for UniversalGateway: a standard request (native gas) and a token-gas request (ERC-20 gas with Uniswap swap parameters).

  • TypesUGPC — defines the outbound request struct for UniversalGatewayPC, including recipient (raw bytes for cross-VM compatibility), PRC-20 token, amount, gas limit, payload, and revert recipient.

  • Errors — shared custom error library used across all gateway and vault contracts. Defines common validation errors and domain-specific errors for deposits, withdrawals, rate limiting, slippage, and token burns.

Privileged roles

  • The DEFAULT_ADMIN_ROLE holder in the UniversalGateway contract can update all critical protocol parameters including the TSS address (via updateTSS), the Vault address (via updateVault, which also transfers VAULT_ROLE), USD rate-limit caps, the per-block USD cap, Uniswap V3 router and factory addresses, Chainlink oracle feed addresses and staleness thresholds, L2 sequencer feed and grace period, the CEA factory address, the protocol fee amount, token whitelist and rate-limit thresholds, and the epoch duration. Changing these parameters takes effect immediately without a timelock or delay.

  • The DEFAULT_ADMIN_ROLE holder in the Vault contract can update the gateway address (via setGateway), the CEA factory address (via setCEAFactory), and migrate all token balances (ERC20 and native) to a new vault (via migrateTokens, which requires both the Vault and Gateway to be paused). These changes take effect immediately.

  • The DEFAULT_ADMIN_ROLE holder in the UniversalGatewayPC contract can update the VaultPC address (via setVaultPC) and the UniversalCore address (via setUniversalCore). These changes take effect immediately.

  • The DEFAULT_ADMIN_ROLE holder in the VaultPC contract has no protocol-specific configuration setters beyond granting and revoking other roles.

  • Across all four contracts, the DEFAULTADMINROLE holder can grant and revoke any other role, including granting the admin role itself to other addresses.

  • The TSS_ROLE holder in the Vault contract is the sole authority that can finalize outbound transactions (releasing funds to users on external chains via CEA contracts), revert failed inbound transactions (returning funds to the original sender via the Gateway), and rescue stuck funds. All fund movement from the Vault to end users passes through this role.

  • Note: TSSROLE is **not defined** in the UniversalGateway contract. The Gateway tracks a `TSSADDRESS` state variable that serves as the recipient for native fees and deposits, but TSS-related authorization for outbound operations is enforced exclusively in the Vault contract. The previous TSS_ROLE in UniversalGateway was removed as it was not used for any access control check.

  • The VAULT_ROLE holder in the UniversalGateway contract is the only address authorized to trigger revert and rescue operations on the gateway. In practice, this role is assigned to the Vault contract, allowing it to route refund and rescue flows through the gateway's replay-protected transfer logic.

  • The PAUSER_ROLE holder can pause and unpause the respective contract. When paused, all user-facing operations (deposits, outbound transactions, finalizations, reverts, rescues) are halted. This role exists in all four contracts: UniversalGateway, Vault, UniversalGatewayPC, and VaultPC.

  • The MANAGER_ROLE holder in the VaultPC contract can withdraw any amount of native PC tokens or PRC-20 tokens from the fee vault to any address. This role has full custody authority over all fees accumulated in VaultPC.

Potential Risks

Centralized Admin Control Without Timelock: The admin role holder across UniversalGateway, Vault, UniversalGatewayPC, and VaultPC can modify critical protocol parameters with immediate effect, including TSS and Vault references, oracle feeds, Uniswap configuration, CEA factory, rate limits, protocol fees, and token support settings. In Vault, the admin can also migrate all ERC-20 and native balances to a new vault while the system is paused. No timelock, governance vote, or multi-step confirmation is required.

TSS Single Point of Trust: The TSS authority is the most privileged operational actor. It controls outbound finalization through Vault, token reverts, rescues, and indirectly native reverts/rescues through UniversalGateway. If compromised or unavailable, TSS can drain Vault-held assets, retain deposited native funds, suppress relaying, or leave users without an on-chain recovery path.

Off-Chain Relay Liveness Dependency: Cross-chain execution depends on TSS observing events and submitting destination-chain transactions. Sustained TSS downtime, RPC failures, event censorship, or network partitions can leave ERC-20 tokens locked in Vault, native funds held by TSS, or PRC-20 tokens burned on Push Chain without corresponding release. The rescue path in UniversalGatewayPC still depends on TSS execution.

Manager Role Has Unrestricted Fee Withdrawal: The manager role holder in VaultPC can withdraw all native PC and PRC-20 balances to any address without per-withdrawal limits, cooldowns, or multi-signature confirmation. If the role is assigned to a single compromised EOA, all accumulated protocol fees are immediately drainable.

Pauser Role Can Halt All Operations Indefinitely: The pauser role holder in UniversalGateway, Vault, UniversalGatewayPC, and VaultPC can halt user-facing operations indefinitely, including deposits, outbound transactions, finalizations, reverts, and rescues. There is no forced-unpause mechanism or automatic expiry, and recovery requires role reassignment if the pauser key is lost or compromised.

Oracle Dependency for Rate Limiting: Instant-route USD caps depend on the Chainlink ETH/USD feed. If the oracle returns stale, unavailable, or manipulated prices, the protocol may enforce incorrect real-value limits. Existing staleness and L2 sequencer checks reduce this risk but do not provide a fallback oracle or full circuit-breaker mechanism.

Upgradeable Contracts Without Timelock: UniversalGateway, Vault, UniversalGatewayPC, and VaultPC use the OpenZeppelin upgradeable proxy pattern. The proxy admin can upgrade contract logic immediately without a mandatory review period, timelock, or governance approval, creating risk of malicious or flawed upgrades.

Interactions with External DeFi Protocols: The system relies on Uniswap v3 for gas-related swaps and allows CEA multicall execution against arbitrary external DeFi protocols. This exposes users and protocol flows to inherited risks such as pool manipulation, router issues, liquidity depletion, and vulnerabilities in target protocols.

Report Modification Notice: This report was modified on May 27th, 2026, at the client’s request to incorporate minor code changes introduced up to commit 80f7a20. While these updates were intended to align the report with the latest version of the codebase provided by the client, modifications to previously published audit content may affect the continuity and integrity of the original findings. Hacken reviewed the updated changes to confirm that they correspond solely to the requested modifications. However, any future changes involving substantial code updates or additional commits should undergo a separate security assessment to ensure that no new risks are introduced to the project’s security posture.

Findings

Code
Title
Status
Severity
F-2026-1573Fee-on-Transfer ERC20 Tokens Cause Vault Insolvency and Permanent Fund Lock in Revert/Rescue Paths
fixed

High
F-2026-1564UniversalGatewayPC Relies on IUniversalCore.BASEGASLIMIT(), but UniversalCore Does Not Implement It
fixed

High
F-2026-1573Inconsistent Recipient Semantics Between Documentation and Funds Event Emission
accepted

Medium
F-2026-1565rescueFundsOnSourceChain Lacks Replay Protection and universalTxId–Token Binding
accepted

Medium
F-2026-1565_burnPRC20 Ignores transferFrom Return Value, Allowing Silent Transfer Failure
fixed

Medium
F-2026-1564Documentation and Implementation Mismatch in Token Support Validation
fixed

Medium
F-2026-1564updateEpochDuration Implicitly Resets Rate-Limit Usage for All Tokens
mitigated

Medium
F-2026-1564Inconsistent Role Management Causes State and Role Mismatch
fixed

Medium
F-2026-1576Misleading TSS Control Description in UniversalGateway Documentation
fixed

Low
F-2026-1574Refund to Non-Receiving Contract Can Revert and Block Entire Outbound Transaction
accepted

Low
1-10 of 38 findings

Identify vulnerabilities in your smart contracts.

Appendix 1. Definitions

Severities

When auditing smart contracts, Hacken is using a risk-based approach that considers Likelihood, Impact, Exploitability and Complexity metrics to evaluate findings and score severities.

Reference on how risk scoring is done is available through the repository in our Github organization:

Severity

Description

Critical
Critical vulnerabilities are usually straightforward to exploit and can lead to the loss of user funds or contract state manipulation.

High
High vulnerabilities are usually harder to exploit, requiring specific conditions, or have a more limited scope, but can still lead to the loss of user funds or contract state manipulation.

Medium
Medium vulnerabilities are usually limited to state manipulations and, in most cases, cannot lead to asset loss. Contradictions and requirements violations. Major deviations from best practices are also in this category.

Low
Major deviations from best practices or major Gas inefficiency. These issues will not have a significant impact on code execution.
  • Severity

    Critical

    Description

    Critical vulnerabilities are usually straightforward to exploit and can lead to the loss of user funds or contract state manipulation.

    Severity

    High

    Description

    High vulnerabilities are usually harder to exploit, requiring specific conditions, or have a more limited scope, but can still lead to the loss of user funds or contract state manipulation.

    Severity

    Medium

    Description

    Medium vulnerabilities are usually limited to state manipulations and, in most cases, cannot lead to asset loss. Contradictions and requirements violations. Major deviations from best practices are also in this category.

    Severity

    Low

    Description

    Major deviations from best practices or major Gas inefficiency. These issues will not have a significant impact on code execution.

Potential Risks

The "Potential Risks" section identifies issues that are not direct security vulnerabilities but could still affect the project’s performance, reliability, or user trust. These risks arise from design choices, architectural decisions, or operational practices that, while not immediately exploitable, may lead to problems under certain conditions. Additionally, potential risks can impact the quality of the audit itself, as they may involve external factors or components beyond the scope of the audit, leading to incomplete assessments or oversight of key areas. This section aims to provide a broader perspective on factors that could affect the project's long-term security, functionality, and the comprehensiveness of the audit findings.

Appendix 2. Scope

The scope of the project includes the following smart contracts from the provided repository:

Scope Details

Repositoryhttps://github.com/pushchain/push-chain-gateway-contracts
Commit0928967cce6cdac2a584340892daf621ff173abd
Remediation commit4249311df6a388265866b1be6de6ac216b3dbfc0
Post Audit Changes80f7a208bcd484601a86d55e5a3891727e7f0ef9
Whitepaper-
Requirementshttps://github.com/pushchain/push-chain-gateway-contracts/tree/audit-main/contracts/evm-gateway/docs
Technical Requirementshttps://github.com/pushchain/push-chain-gateway-contracts/tree/audit-main/contracts/evm-gateway/docs

Assets in Scope

programs
pushsolanalocker
src
lib.rs - programs › pushsolanalocker › src › lib.rs
src
interfaces
IAMMInterface.sol - src › interfaces › IAMMInterface.sol
Interfaces
IUEA.sol - src › Interfaces › IUEA.sol
IUEAFactory.sol - src › Interfaces › IUEAFactory.sol
libraries
Errors.sol - src › libraries › Errors.sol
Types.sol - src › libraries › Types.sol
UEA
UEA_EVM.sol - src › UEA › UEA_EVM.sol
UEA_SVM.sol - src › UEA › UEA_SVM.sol
UEAFactoryV1.sol - src › UEAFactoryV1.sol
UniversalGateway.sol - src › UniversalGateway.sol
Errors.sol - Errors.sol
Types.sol - Types.sol
TypesUG.sol - TypesUG.sol
TypesUGPC.sol - TypesUGPC.sol

Appendix 3. Additional Valuables

Additional Recommendations

The smart contracts in the scope of this audit could benefit from the introduction of automatic emergency actions for critical activities, such as unauthorized operations like ownership changes or proxy upgrades, as well as unexpected fund manipulations, including large withdrawals or minting events. Adding such mechanisms would enable the protocol to react automatically to unusual activity, ensuring that the contract remains secure and functions as intended.

To improve functionality, these emergency actions could be designed to trigger under specific conditions, such as:

  • Detecting changes to ownership or critical permissions.

  • Monitoring large or unexpected transactions and minting events.

  • Pausing operations when irregularities are identified.

These enhancements would provide an added layer of security, making the contract more robust and better equipped to handle unexpected situations while maintaining smooth operations.

Frameworks and Methodologies

This security assessment was conducted in alignment with recognised penetration testing standards, methodologies and guidelines, including the NIST SP 800-115 – Technical Guide to Information Security Testing and Assessment , and the Penetration Testing Execution Standard (PTES) , These assets provide a structured foundation for planning, executing, and documenting technical evaluations such as vulnerability assessments, exploitation activities, and security code reviews. Hacken’s internal penetration testing methodology extends these principles to Web2 and Web3 environments to ensure consistency, repeatability, and verifiable outcomes.

Disclaimer