Parity Finance Liquid Staking & Early Purchase

QuantstampFiles named in the report

Quantstamp reviewed Parity Finance Liquid Staking & Early Purchase on 3 Jun 2025: 32 findings, 0 critical; 22 marked fixed, 10 open.

No open critical findings
Open the reportOpen Parity Finance Liquid Staking & Early Purchase’s security record

Report hosted on certificate.quantstamp.com.

Trustblock does not review code.

Findings32

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

SeverityOpenAcknowledgedFixed
Critical000
High006
Medium207
Low809
HighBase Tokens Are Not Transferred Out After Restaking Expired WithdrawalsFixed

The `liquid_staking::restake_expired_withdrawal::handler()` function restakes the expired withdrawals by minting LST tokens back to the stakers. However, it does not transfer the relevant user's base tokens (funded by the depositor) from the `window_base_token_account` to the `pair_base_token_account`. Therefore, these base tokens will remain locked in the `window_base_token_account`, preventing the closing of the `withdrawal_window` in the `liquid_staking::close_withdrawal_window::handler()` function.

HighCollected Payments Remain Locked in the Sale AccountFixed

During the token purchase phase in the `early-purchase` program, buyers transfer their payments (either SPL tokens to the `sale_payment_ata` or SOL directly to the Sale PDA). The sale organizer (acting through a Guardian) deposits the `sale.purchase_mint` tokens for distribution after the sale ends. However, the program lacks a mechanism to transfer the collected buyer payments from the `Sale` PDA and ATA accounts to the sale organizer or a designated treasury. It is also noted that the address of the user initiating the sale is not saved in the `Sale` PDA, and only guardians with `deposit_tokens` permission can deposit the `sale.purchase_mint` tokens.

HighIncorrect Amount Transferred During Token DepositsFixed

The  `early_purchase::deposit_tokens::handler()` function is intended to enable a Guardian to deposit a specified quantity of `purchase_mint` tokens (`params.amount_to_deposit`) into the sale token vault  `sale_purchase_ata`. However, the `token::transfer` CPI within this instruction incorrectly uses `sale.calculate_base_purchase_cost(amount_to_deposit)` as the amount argument for the transfer instead of the `amount_to_deposit`, resulting in a significantly different value: ```rust token::transfer( CpiContext::new( purchase_program.to_account_info(), token::Transfer { from: authority_purchase_ata.to_account_info(), to: sale_purchase_ata.to_account_info(), authority: authority.to_account_info(), }, ), sale.calculate_base_purchase_cost(amount_to_deposit), ) ```

HighIncorrect Authority Used for Token Transfer Prevents All RedemptionsFixed

The `early_purchase::redeem_receipt::handler()` function is responsible for transferring the `purchase_mint` tokens from the sale's ATA (`config_purchase_ata`) to the buyer's ATA (`buyer_purchase_ata`) during sale receipt redemption. However, the `token::transfer` CPI is incorrectly configured with the `buyer` as the authority for this transfer: ```rust token::transfer( CpiContext::new( purchase_program.to_account_info(), token::Transfer { from: config_purchase_ata.to_account_info(), to: buyer_purchase_ata.to_account_info(), authority: buyer.to_account_info(), }, ), num_tokens_pending, ) ```

HighMissing/limited Test Suite in Early Purchase ProgramFixed

The Early Purchase program appears to be completly missing a test suite. Contracts that are not extensively tested are at high risk of serious bugs that can impact the protocol's proper functioning and security. While audits can help developers to find bugs, they are not a substitute for thorough unit and integration testing.

HighTokens Can Be Redeemed From Any SaleFixed

Sale accounts can be created by any user and they are assigned as their admins. Additionally, receipt PDAs are derived with the following seeds at the buyer's first token purchase: ``` seeds = [ Receipt::PREFIX.as_bytes(), &buyer.key.to_bytes() ] ``` This implies that `Receipt` accounts are initialized in a 1:1 relation to buyer accounts, allowing an attacker to create a receipt and purchase an amount of a worthless token and redeem the receipt against a sale that holds actual, legitimate tokens.

MediumGuardians Can Prematurely End a SaleFixed

The `early_purchase::end_sale::handler()`function is used by a guardian to end a specific sale. However, the this function does not check that the referenced sale end time has passed (`sale.is_end_time_reached()`), allowing guardians to end any sale even before it has officially ended.

MediumImproper Space Allocation for `PDA` InitializationFixed

The instructions that initialize PDAs in the `early-purchase` program use the `space` parameter (`#[account(init, payer = ..., space = ...)]`) to specify the space needed for account creation. The `space` attribute expects the total space required for the account's data, including an 8-byte discriminator. However, the 8-byte discriminator is not accounted for in the size calculation. If insufficient space is allocated, it could lead to runtime errors during account initialization or data serialization issues later if data attempts to write past the allocated boundary.

MediumLack of Slippage ProtectionFixed

When users purchase tokens in the `early-purchase` program using SOL, the current SOL price is determined dynamically at the time of transaction execution using a Pyth Network oracle price feed. However, the current token purchase implementation does not allow users to specify a maximum amount of SOL they are willing to pay for their desired quantity of purchase tokens, only the number of tokens to buy. While the `sale.max_price_feed_age` check ensures the oracle price is not excessively stale, it does not protect against legitimate, recent price volatility that occurs before transaction confirmation. The `sale.purchase_mint` token price (`sale.payment_amount`) may also change without the buyer's knowledge.

MediumOngoing or Imminent Sales Can Be Arbitrarily UpdatedFixed

The `early_purchase::update_sale::handler()` function permits `Guardians` with `update_sale` permissions to modify critical parameters such as `sale.purchase_mint`, `sale.payment_mint`, `sale.guard_purchases` and so on, even if the `sale.is_start_time_reached()`is `true`. Buyers typically make purchase decisions based on the observed state of the sale. If these parameters can be altered while the sale is active or just moments before a buyer's transaction is processed, a buyer might inadvertently pay a different price (potentially higher) or face different purchasing conditions than they initially expected. The `purchase_tokens` instruction calculates the cost dynamically at the time of execution based on the current `Sale` state. This could lead to user frustration, loss of trust, and scenarios where buyers feel deceived if, for instance, the token price effectively increases due to a mid-sale update.

Show 10 more
MediumSales Cannot Be FrozenFixed

`Sale` accounts are supposedly freezable by guardians/admins as they have an `is_frozen()` function that checks if `self.state == SaleState::Frozen`, which is called in the `PurchaseTokens` instruction handler. However there is no mechanism allowing authority to freeze and unfreeze sales as no instruction implements such a logic.

MediumStrict Token Balance Check in `close_withdrawal_window` Creates a Denial of Service RiskFixed

A malicious user may transfer a few base tokens directly to a `window_base_token_account` of the `liquid-staking` program, preventing the `window_authority` to closing the ATA because of the following strict check: ```rust require!( window_base_token_account.amount == 0, StakingError::WindowHasActiveRequests ); ```

MediumUnrestricted Sale Creation Can Result in Denial of Service AttackFixed

The `early_purchase::initialize_sale::handler()` function allows any user to create a new `Sale`. However, it does not implement any fee or significant disincentive beyond standard Solana transaction costs and account rent. This open and low-cost sale creation mechanism that can be exploited by malicious actors to spam the platform by creating a large number of sales or create sales with malicious properties.

Low`minimum_deposit` < `deposit_cap` Is Not EnforcedFixed

In `liquid_staking::create_pair::handler()` function and `liquid_staking::update_pair_limits::handler()` are missing the validations that ensure `minimum_deposit < deposit_cap`.

LowConfig Can Be Initialized by AnyoneFixed

No checks exist to enforce that the signer initializing the config is a specific pre-determined address. This allows anyone to initialize the config and takeover its control.

LowEarly Purchase Guardian Authority Cannot Be Migrated to a New Pubkey After InitializationFixed

The `early_purchase::initialize_guardian::handler()` function allows an admin to create a new Guardian account, but provides no mechanism to update the `authority` Pubkey once set. This creates a significant risk if guardian credentials are compromised or need to be rotated. This is because the `update_guardian` instruction only enables updating the `permissions` but not the `authority`. Additionally, the `GuardianPermissions::manage_guardians` permission exists in the codebase but remains unused, suggesting an incomplete implementation of guardian management functionality.

LowImproper Yield ValidationFixed

The `liquid_staking::create_pair::handler()` function does not validate the `interval_apr_rate` value, and the current check in the `liquid_staking::update_pair_yield::handler()` only prevents setting the `interval_apr_rate` value to zero. The improper validations allow setting non-positive yield rate values because the rate is adjusted with `PRECISION` (`1e12`) in the exchange rate calculations. The `liquid_staking::create_pair::handler()` function does not limit the maximum value of `interval_apr_rate`, the `MAX_INTERVAL_APR_RATE` is only enforced in the `instructions::update_pair_yield::handler()` function.

LowIncorrect Minimum and Excess Deposit Checks in `LST` SwapsFixed

The `liquid_staking::swap_lst::handler()` function enables holders of one LST to swap it for a different LST. However the function call on the `destination_pair` that checks if the deposit is too large incorrectly passes zero for the `base_token_amount` field of the function `destination_pair.check_excessive_deposit(quote_amount, base_token_amount)`. Moreover, it lacks a check to validate the the deposit meets the minimum bar via `check_minimum_deposit()`.

LowMissing Instruction to Update `max_price_feed_age`Fixed

The `early_purchase::initialize_sale::handler()` function accepts a `max_price_feed_age` parameter that determines the maximum allowable staleness of price feed data. However, once set, this critical parameter cannot be modified. If an administrator configures this value incorrectly during initialization, there is no mechanism available to correct it, potentially leading to permanent operational issues with price feed validation.

LowMissing Upper Limit for Liquid Staking Fees May Be Prohibitive to UsersFixed

The `liquid_staking::update_pair_limits::handler()`function creates a pair and takes in a `CreatePairParams` struct instance that holds the `stake_fee_bps`, `swap_fee_bps`, and `withdraw_fee_bps` values. The fee percentage BPS values ​​can be set up to 10000, allowing the program to be configured with a 100% fee percentage.

Show 2 more
LowMissing Validation Can Lead to Duplicate Guardians in `AccessControl` Compromising Security RedundancyFixed

In `liquid_staking::manage_guardian::handler()`function, an `unseal_authority` can add or remove guardians from the `AccessControl` Account. While the `AccessControl` account supports adding up to five guardians for security redundancy, the implementation lacks duplicate checking for each guardian `Pubkey`. This oversight allows the same guardian `Pubkey` to be added multiple times, potentially compromising the intended redundancy if multiple or all five guardian slots contain identical keys.

LowUnsealing Is Not Verified in `create_token_metadata`Fixed

The `liquid_staking::create_token_metadata::handler()` function does not call `access_control.verify_unsealed()?;`, preventing the guardians from sealing the function in case of emergency.

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 (436)

  • clients/js/src/generated/liquid_staking/instructions/fundWithdrawalWindow.ts
  • tests/unit-tests/rate-calculations.test.ts
  • programs/early-purchase/src/state/guardian.rs
  • clients/js/src/generated/liquid_staking/instructions/vaultWithdraw.ts
  • clients/js/src/generated/early_purchase/accounts/guardian.ts
  • clients/js/src/generated/liquid_staking/types/authorityType.ts
  • clients/js/src/index.ts
  • clients/js/dist/src/generated/liquid_staking/instructions/index.js.map
  • clients/rust/generated/liquid_staking/instructions/seal_program.rs
  • clients/js/dist/src/generated/liquid_staking/instructions/createAccessControl.js
  • clients/js/dist/src/generated/liquid_staking/instructions/createTokenMetadata.d.ts
  • clients/rust/generated/liquid_staking/instructions/create_withdrawal_window.rs
  • clients/js/dist/src/generated/early_purchase/accounts/receipt.js
  • clients/js/dist/src/generated/early_purchase/shared/index.d.ts
  • clients/js/dist/src/generated/early_purchase/accounts/sale.js
  • clients/js/dist/src/generated/liquid_staking/instructions/fundWithdrawalWindow.js.map
  • programs/liquid-staking/src/state/pair.rs
  • clients/js/src/generated/liquid_staking/errors/index.ts
  • tests/helpers/index.ts
  • programs/early-purchase/src/instructions/deposit_tokens.rs
  • clients/js/yarn.lock
  • clients/js/dist/src/generated/liquid_staking/instructions/initiateAuthorityTransfer.d.ts
  • clients/js/dist/src/generated/liquid_staking/instructions/createTokenMetadata.js
  • clients/js/dist/src/generated/liquid_staking/types/authorityType.d.ts
  • clients/rust/generated/early_purchase/mod.rs
  • clients/js/dist/src/generated/liquid_staking/accounts/accessControl.d.ts
  • clients/js/src/generated/liquid_staking/errors/liquidStaking.ts
  • clients/js/dist/src/generated/early_purchase/instructions/initializeSale.js.map
  • clients/js/src/generated/liquid_staking/instructions/updatePairLimits.ts
  • clients/js/dist/src/generated/liquid_staking/instructions/unsealProgram.js.map
  • clients/js/dist/src/generated/liquid_staking/instructions/initiateAuthorityTransfer.js.map
  • clients/js/dist/src/generated/liquid_staking/accounts/accessControl.js.map
  • programs/liquid-staking/src/instructions/seal_program.rs
  • clients/js/src/generated/early_purchase/errors/index.ts
  • clients/js/README.md
  • clients/js/src/utils/rateCalculations.ts
  • clients/js/dist/src/generated/liquid_staking/accounts/pair.js
  • clients/js/dist/src/utils/merkle.d.ts
  • clients/rust/generated/liquid_staking/types/guardian_operation.rs
  • clients/js/dist/src/generated/liquid_staking/instructions/createPair.js.map
  • clients/js/dist/src/generated/liquid_staking/instructions/updatePairYield.js
  • clients/js/src/generated/liquid_staking/instructions/createTokenMetadata.ts
  • clients/js/dist/src/generated/liquid_staking/instructions/createTokenMetadata.js.map
  • programs/liquid-staking/src/instructions/update_whitelist.rs
  • clients/js/src/generated/early_purchase/instructions/initializeSale.ts
  • tests/unit-tests/withdrawal.test.ts
  • clients/js/dist/src/generated/liquid_staking/errors/liquidStaking.js
  • clients/js/dist/src/generated/liquid_staking/instructions/createWithdrawalWindow.js.map
  • clients/rust/generated/early_purchase/instructions/initialize_sale.rs
  • clients/js/dist/src/generated/early_purchase/instructions/updateSale.d.ts
  • clients/js/dist/src/generated/liquid_staking/instructions/requestWithdraw.js
  • clients/js/dist/src/generated/liquid_staking/types/authorityType.js.map
  • clients/js/dist/src/generated/liquid_staking/shared/index.js.map
  • clients/js/dist/src/generated/liquid_staking/accounts/withdrawalRequest.js
  • clients/js/dist/src/generated/liquid_staking/instructions/vaultWithdraw.d.ts
  • clients/rust/generated/liquid_staking/instructions/create_access_control.rs
  • clients/js/dist/src/generated/liquid_staking/instructions/cancelAuthorityTransfer.js
  • programs/liquid-staking/src/instructions/stake.rs
  • programs/early-purchase/src/state/sale.rs
  • clients/rust/generated/liquid_staking/instructions/swap_lst.rs
  • clients/js/dist/src/generated/early_purchase/errors/earlyPurchase.js.map
  • clients/js/dist/src/generated/liquid_staking/instructions/updatePairLimits.js.map
  • clients/js/dist/src/generated/early_purchase/types/verificationLevel.d.ts
  • clients/js/dist/src/generated/early_purchase/instructions/purchaseTokens.js
  • clients/rust/generated/early_purchase/instructions/initialize_config.rs
  • programs/early-purchase/src/instructions/initialize_guardian.rs
  • clients/js/dist/src/generated/early_purchase/accounts/guardian.js
  • clients/js/dist/src/generated/liquid_staking/instructions/sealProgram.d.ts
  • clients/js/dist/src/generated/liquid_staking/programs/index.d.ts
  • clients/js/dist/src/generated/early_purchase/instructions/updateSale.js
  • clients/rust/generated/early_purchase/accounts/sale.rs
  • programs/liquid-staking/src/state/withdrawal_request.rs
  • clients/rust/generated/liquid_staking/programs.rs
  • programs/liquid-staking/src/instructions/swap_lst.rs
  • clients/rust/generated/early_purchase/types/price_feed_message.rs
  • clients/js/dist/src/generated/liquid_staking/types/index.js
  • clients/js/dist/src/generated/liquid_staking/programs/index.js
  • programs/liquid-staking/src/instructions/fund_withdrawal_window.rs
  • clients/js/dist/src/generated/early_purchase/instructions/index.js.map
  • clients/js/dist/src/generated/liquid_staking/instructions/createWithdrawalWindow.js
  • clients/rust/generated/liquid_staking/shared.rs
  • programs/early-purchase/src/state/receipt.rs
  • clients/js/dist/src/generated/early_purchase/accounts/receipt.d.ts
  • clients/js/src/generated/early_purchase/instructions/redeemReceipt.ts
  • clients/js/dist/src/generated/liquid_staking/instructions/vaultWithdraw.js.map
  • clients/js/dist/src/generated/liquid_staking/instructions/cancelWithdrawalRequest.d.ts
  • clients/js/dist/src/generated/early_purchase/accounts/index.d.ts
  • clients/js/dist/src/generated/liquid_staking/instructions/stake.d.ts
  • clients/rust/generated/liquid_staking/instructions/create_pair.rs
  • clients/js/dist/src/generated/liquid_staking/instructions/manageGuardian.d.ts
  • tests/unit-tests/staking.test.ts
  • programs/liquid-staking/src/instructions/initiate_authority_transfer.rs
  • clients/js/src/generated/liquid_staking/instructions/updatePairYield.ts
  • tests/helpers/accounts.ts
  • package.json
  • clients/js/dist/src/generated/liquid_staking/instructions/requestWithdraw.d.ts
  • clients/js/dist/src/generated/liquid_staking/instructions/updatePairLimits.js
  • clients/js/dist/src/generated/liquid_staking/errors/liquidStaking.js.map
  • clients/rust/generated/liquid_staking/instructions/unseal_program.rs
  • clients/js/dist/src/generated/liquid_staking/instructions/index.js
  • clients/js/dist/src/generated/liquid_staking/accounts/pair.js.map
  • clients/js/src/generated/early_purchase/types/verificationLevel.ts
  • programs/liquid-staking/src/instructions/mod.rs
  • clients/js/src/generated/liquid_staking/instructions/executeWithdraw.ts
  • clients/js/dist/src/generated/liquid_staking/types/index.d.ts
  • scripts/create-pairs.ts
  • clients/js/dist/src/generated/early_purchase/programs/index.d.ts
  • clients/rust/generated/liquid_staking/accounts/withdrawal_window.rs
  • tests/helpers/pairs.ts
  • tsconfig.json
  • clients/js/src/generated/early_purchase/shared/index.ts
  • clients/rust/generated/liquid_staking/errors/mod.rs
  • clients/js/dist/src/generated/early_purchase/types/index.js.map
  • clients/js/dist/src/generated/liquid_staking/instructions/vaultWithdraw.js
  • clients/js/src/generated/liquid_staking/instructions/createPair.ts
  • clients/js/dist/src/generated/early_purchase/index.d.ts
  • clients/rust/generated/early_purchase/instructions/purchase_tokens.rs
  • clients/js/dist/src/generated/liquid_staking/instructions/requestWithdraw.js.map
  • programs/liquid-staking/src/instructions/withdraw_fees.rs
  • programs/liquid-staking/src/state/withdrawal.rs
  • clients/js/dist/src/generated/liquid_staking/programs/index.js.map
  • programs/liquid-staking/src/instructions/request_withdraw.rs
  • programs/liquid-staking/src/instructions/manage_guardian.rs
  • clients/rust/generated/early_purchase/accounts/config.rs
  • clients/js/dist/src/generated/early_purchase/types/saleState.js
  • clients/js/dist/src/generated/liquid_staking/instructions/cancelAuthorityTransfer.d.ts
  • clients/js/dist/src/generated/liquid_staking/index.js.map
  • clients/js/src/generated/liquid_staking/instructions/restakeExpiredWithdraw.ts
  • clients/js/dist/src/generated/liquid_staking/errors/index.d.ts
  • clients/js/dist/src/generated/liquid_staking/programs/liquidStaking.js.map
  • clients/js/src/generated/early_purchase/instructions/initializeGuardian.ts
  • clients/rust/generated/early_purchase/types/mod.rs
  • clients/rust/generated/early_purchase/instructions/end_sale.rs
  • versions.txt
  • clients/js/dist/src/generated/early_purchase/instructions/initializeConfig.d.ts
  • programs/early-purchase/src/instructions/update_guardian.rs
  • clients/js/src/generated/early_purchase/instructions/updateSale.ts
  • programs/early-purchase/Xargo.toml
  • clients/js/dist/src/generated/early_purchase/instructions/updateSale.js.map
  • tests/unit-tests/pair-configuration.test.ts
  • clients/js/src/generated/liquid_staking/instructions/index.ts
  • clients/js/dist/src/generated/liquid_staking/shared/index.d.ts
  • clients/js/dist/src/generated/early_purchase/programs/earlyPurchase.d.ts
  • clients/js/test-import.js
  • clients/js/dist/src/generated/early_purchase/instructions/depositTokens.js
  • programs/liquid-staking/src/types.rs
  • clients/js/dist/src/generated/liquid_staking/instructions/acceptAuthorityTransfer.js.map
  • clients/js/dist/src/utils/merkle.js
  • clients/rust/generated/early_purchase/accounts/mod.rs
  • clients/js/src/generated/early_purchase/instructions/purchaseTokens.ts
  • clients/js/src/generated/liquid_staking/programs/index.ts
  • clients/js/dist/src/generated/liquid_staking/accounts/index.d.ts
  • clients/js/dist/src/generated/liquid_staking/instructions/acceptAuthorityTransfer.js
  • programs/early-purchase/src/instructions/redeem_receipt.rs
  • clients/js/dist/src/generated/liquid_staking/instructions/withdrawFees.js
  • Cargo.lock
  • clients/js/dist/src/generated/early_purchase/instructions/depositTokens.d.ts
  • clients/js/src/generated/early_purchase/index.ts
  • clients/js/dist/src/generated/early_purchase/instructions/initializeGuardian.js.map
  • tests/unit-tests/vault-management.test.ts
  • clients/js/src/generated/early_purchase/accounts/receipt.ts
  • clients/js/dist/src/generated/liquid_staking/accounts/withdrawalRequest.d.ts
  • clients/rust/generated/liquid_staking/instructions/update_pair_yield.rs
  • programs/liquid-staking/src/lib.rs
  • clients/js/dist/src/generated/early_purchase/accounts/config.js
  • clients/js/dist/src/generated/early_purchase/instructions/updateGuardian.d.ts
  • clients/rust/generated/liquid_staking/instructions/vault_withdraw.rs
  • programs/liquid-staking/src/instructions/vault_withdraw.rs
  • clients/rust/generated/liquid_staking/accounts/mod.rs
  • clients/js/dist/src/generated/early_purchase/errors/index.js.map
  • clients/js/dist/src/generated/liquid_staking/instructions/sealProgram.js
  • clients/js/src/generated/liquid_staking/instructions/withdrawFees.ts
  • clients/js/src/generated/early_purchase/accounts/config.ts
  • clients/js/dist/src/utils/rateCalculations.js
  • clients/js/dist/src/index.js
  • clients/rust/generated/liquid_staking/instructions/withdraw_fees.rs
  • clients/js/dist/src/index.js.map
  • programs/liquid-staking/src/u64x64_math.rs
  • clients/js/dist/src/generated/early_purchase/instructions/updateGuardian.js
  • clients/rust/generated/liquid_staking/mod.rs
  • tests/unit-tests/program-sealing.test.ts
  • tests/unit-tests/rates.test.ts
  • clients/js/dist/src/generated/liquid_staking/accounts/pair.d.ts
  • clients/js/dist/src/generated/early_purchase/instructions/updateGuardian.js.map
  • clients/js/dist/src/generated/early_purchase/types/guardianPermissions.js.map
  • tests/unit-tests/whitelist.test.ts
  • gitignore
  • clients/rust/generated/liquid_staking/instructions/close_withdrawal_window.rs
  • clients/js/dist/src/generated/liquid_staking/errors/index.js
  • clients/rust/generated/liquid_staking/instructions/restake_expired_withdraw.rs
  • clients/js/dist/src/generated/early_purchase/accounts/guardian.js.map
  • clients/js/src/generated/liquid_staking/instructions/requestWithdraw.ts
  • clients/js/dist/src/generated/liquid_staking/accounts/withdrawalWindow.js.map
  • clients/js/dist/src/generated/liquid_staking/accounts/withdrawalRequest.js.map
  • tests/unit-tests/token-metadata.test.ts
  • clients/js/dist/src/generated/early_purchase/instructions/purchaseTokens.js.map
  • clients/js/src/generated/early_purchase/instructions/index.ts
  • clients/rust/generated/liquid_staking/instructions/stake.rs
  • clients/js/dist/src/generated/early_purchase/instructions/endSale.d.ts
  • programs/liquid-staking/src/instructions/create_access_control.rs

Part of Parity Finance Liquid Staking & Early Purchase’s security record

Parity Finance Liquid Staking & Early Purchase
Audits2 audits by 1 firmLast audit Jun 2025, by Quantstamp.
Critical findingsNo open critical findingsAcross 2 reports.
Open Parity Finance Liquid Staking & Early Purchase’s security record

Security firm

Quantstamp

236 projects reviewed · 332 reports · latest Oct 2026

See Quantstamp’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