Plexrum Info

Universal Ownership for real-world assets. Plexrum is a unified ecosystem where a property stays scarce — but its ownership becomes infinite. Access · Exchange · Create · Unlock — all on-chain.

Plexrum Logo

Team and KYC Verification

The KYC verification for this project is currently in progress.

The team has submitted their information and verification is pending.

KYC Badge

TrustNet Score

The TrustNet Score evaluates crypto projects based on audit results, security, KYC verification, and social media presence. This score offers a quick, transparent view of a project's credibility, helping users make informed decisions in the Web3 space.

74.42
Poor Excellent

Real-Time Threat Detection

Real-time threat detection, powered by Cyvers.io, is currently not activated for this project.

This advanced feature provides continuous monitoring and instant alerts to safeguard your assets from potential security threats. Real-time detection enhances your project's security by proactively identifying and mitigating risks. For more information, click here.

Security Assessments

Select the audit
"Static Analysis Dynamic Analysis Symbolic Execution SWC Check Manual Review"
Contract address
N/A
Network N/A
License N/A
Compiler N/A
Type N/A
Language Solidity
Onboard date 2026/05/26
Revision date 2026/09/18

Summary and Final Words

No crucial issues found

The contract does not contain issues of high or medium criticality. This means that no known vulnerabilities were found in the source code.

Contract owner cannot mint

It is not possible to mint new tokens.

Contract owner cannot blacklist addresses.

It is not possible to lock user funds by blacklisting addresses.

Contract owner cannot set high fees

The fees, if applicable, can be a maximum of 25% or lower. The contract can therefore not be locked. Please take a look in the comment section for more details.

Token transfer can be locked

Owner can lock user funds with owner functions.

Token cannot be burned

There is no burning within the contract without any allowances

Ownership is not renounced

The owner retains significant control, which could potentially be used to modify key contract parameters.

Contract is not upgradeable

The contract does not use proxy patterns or other mechanisms to allow future upgrades. Its behavior is locked in its current state.

Scope of Work

This audit encompasses the evaluation of the files listed below, each verified with a SHA-1 Hash. The team referenced above has provided the necessary files for assessment.

The auditing process consists of the following systematic steps:

  1. Specification Review: Analyze the provided specifications, source code, and instructions to fully understand the smart contract's size, scope, and functionality.
  2. Manual Code Examination: Conduct a thorough line-by-line review of the source code to identify potential vulnerabilities and areas for improvement.
  3. Specification Alignment: Ensure that the code accurately implements the provided specifications and intended functionalities.
  4. Test Coverage Assessment: Evaluate the extent and effectiveness of test cases in covering the codebase, identifying any gaps in testing.
  5. Symbolic Execution: Analyze the smart contract to determine how various inputs affect execution paths, identifying potential edge cases and vulnerabilities.
  6. Best Practices Evaluation: Assess the smart contracts against established industry and academic best practices to enhance efficiency, maintainability, and security.
  7. Actionable Recommendations: Provide detailed, specific, and actionable steps to secure and optimize the smart contracts.

A file with a different Hash has been intentionally or otherwise modified after the security review. A different Hash may indicate a changed condition or potential vulnerability that was not within the scope of this review.

Final Words

The following provides a concise summary of the audit report, accompanied by insightful comments from the auditor. This overview captures the key findings and observations, offering valuable context and clarity.


Smart Contract Analysis Statement

Contract Analysis

The VestingVault contract manages vesting and claims for PLXR presale buyers, advisors and team members. Buyer allocations are read directly from PresaleCore rather than duplicated, so there is one source of truth for who is owed what. Buyers receive five percent at the token generation event and the remainder linearly over three hundred and sixty-five days following a ninety-day cliff. Advisors use fixed constants and team members use per-member configurable cliff, duration and start offset, both funded from a pool separate from the buyer pool and pulled from the owner on registration. This is the second remediation round on this contract, and it is in good shape: no High or Medium severity issue remains open, and the two most serious items from the first engagement, the absent funding check and the unbounded deferral of the generation event, remain properly closed and were re-verified here. The claim deadlock that had been open since the first engagement is now genuinely resolved, because the presale state this vault gates on has become permissionlessly reachable. The areas that need attention are these:

  • The pause bound added this round is the right response to the finding and the reasoning behind it is correct: unlike the presale, which never custodies buyer funds, this vault holds tokens buyers have already paid for, so a published policy alone would not have been adequate and a code bound was needed. Claims now resume automatically fourteen days after a pause begins, whether or not the owner ever unpauses, and that was verified to work with no owner action at all. The gap is in how the window is anchored. The timestamp is rewritten on every pause and no minimum interval between pauses is enforced, so unpausing and re-pausing starts a fresh fourteen-day window. Those are two separate calls, but an owner able to batch them into one transaction, which is the normal case for a multisig or timelock executor, leaves no block in which a claim is possible. Demonstrated over twenty consecutive windows, roughly ten months, with every claim attempt reverting throughout and nothing claimed. The bound therefore binds an unresponsive owner, which is a real improvement, but not a hostile one, and the code comment claims both. Accumulating paused time in a lifetime budget, or requiring a cooldown at least as long as the pause window between pauses, closes this while preserving the emergency-stop use case.
  • The vesting math library was not part of the sources received, so the schedule could not be read from code in this round. Every schedule constant the vault exposes publicly, and both vesting curves, are re-exported from that library. The documentation half of the previous ambiguity is fixed and is now internally consistent everywhere it appears, with no remaining trace of the seven-hundred-and-thirty-day figure that previously conflicted with the implementation, and that matches what the remediation summary states was confirmed and set. The behavioural checks in this review were run against the library as it appeared in the last revision that contained one, which implements exactly the documented schedule and was verified to pay a buyer their entire allocation with zero residual at the end of the curve. That is evidence about an older file plus the current documentation rather than about the library that will ship, so the schedule should be confirmed against the team's repository.
  • Two small asymmetries are worth tidying. Funding the vault is permissionless while the only route back out is the owner-only surplus rescue, so a third party topping the vault up beyond outstanding obligations is in effect donating to the owner; both halves of that are documented, but as separate facts rather than as the conclusion they add up to. Separately, registering a beneficiary or raising an allocation pulls tokens from the caller while lowering or removing one refunds to whatever address is the owner at that moment. Those are the same address in normal operation, and diverge only if ownership changes between the two operations, which is exactly the kind of step a handover to a multisig would land between.

Ownership Privileges

The ownership of the contract has been retained by the deployer and is intended to be a multisig. Ownership transfer is two-step and renunciation is deliberately disabled. The owner retains full privileges including:

  • Committing the token generation event timestamp, which requires the presale to have reached its terminal state and the vault to already hold enough PLXR to cover every outstanding obligation. It may be corrected at most three times before it is reached, each correction landing within thirty days of the stored value, and it locks permanently once reached.
  • Pausing and unpausing claims. A pause expires automatically after fourteen days, subject to the re-pause behaviour noted above.
  • Adding, updating and removing advisors and team beneficiaries, all of which are rejected once the generation event has been committed. Additions and increases pull PLXR from the caller; reductions and removals refund it.
  • Setting each team member's cliff, vesting duration and start offset within bounded ranges, so no beneficiary's allocation can be locked for an unrealistic period or have its vesting math pushed into an overflow.
  • Rescuing arbitrary ERC-20 tokens other than PLXR, and rescuing PLXR only above total outstanding obligations, which itself requires both the presale to have ended and the generation event to have been committed.
  • No ability to reduce or revoke a buyer's allocation, which is read from the presale and never written here.
  • No ability to claim on a beneficiary's behalf or redirect a claim.
  • No ability to withdraw PLXR that is owed to anyone, and no ability to withdraw ether, of which the vault can now hold none.
  • No ability to defer the generation event indefinitely, and no ability to block claims indefinitely through an unresponsive posture.
  • Renunciation is deliberately disabled, so admin cannot be lost accidentally during the claim phase.

Security Features

The contract implements a substantial set of positive security features:

  • A funding gate on the generation event: the vault must already hold at least total outstanding obligations before the timestamp can be committed. Verified that a one-wei shortfall reverts with the exact required and actual figures and that supplying that one wei lets it through. The single check is sufficient because both obligation sources freeze at that moment, buyer totals by the presale's terminal state and beneficiary changes by the gate itself, which was confirmed as an invariant across one hundred and twenty-eight thousand fuzzed calls.
  • A bounded correction window on the generation event: at most three re-sets, each within thirty days of the stored value, capping post-publication deferral at ninety days, with the counter emitted so it can be audited from events. Verified at each step and at the cap.
  • A code bound on the pause, which releases claims automatically rather than depending on the owner acting, subject to the re-pause caveat above.
  • Buyer allocations read live from the presale rather than duplicated, removing any possibility of the two contracts disagreeing about what is owed.
  • Advisor and team allocations funded from a separate pool pulled from the owner, so beneficiary obligations can never be serviced out of the buyer pool.
  • The vesting token is excluded from the generic rescue path, and the surplus rescue is gated behind both the presale's terminal state and the committed generation event, so nothing owed to anyone can be withdrawn.
  • No ether exit path and no way in: the constructor is no longer payable and the contract has neither a receive function nor a fallback, so the previously reported ether trap is now unreachable by construction rather than mitigated after the fact. Verified that a plain value transfer to the vault fails.
  • Reentrancy guards on all three claim paths, with the claim accounting written before the token transfer.
  • Beneficiary counts capped per list so the removal scan and the list readers stay bounded in gas, and every configurable duration, cliff and offset bounded so the vesting math cannot be pushed into an overflow that would permanently brick a beneficiary's claims.
  • Two-step ownership transfer with renunciation disabled, re-exercised in this review by transferring the vault to a contract owner and accepting from it.
  • Claim accounting verified conservative across the fuzz campaign: no beneficiary ever claims more than their allocation, the aggregate claimed figure always equals the sum of the parts, the outstanding calculation never underflows, and a vault that passed its funding gate stays solvent for every remaining obligation.
  • No declared error or event in either interface is unused, confirmed by a programmatic sweep, and the previous token ticker no longer appears anywhere in the contract or its interface.
  • No High or Medium static-analysis finding. The locked-ether findings raised against this contract in the previous revision are resolved, and the pattern scanner reports zero security-rule and zero best-practice-rule matches.

Note - This audit report consists of a security re-analysis of the VestingVault smart contract following the second round of remediation of the previous engagement's findings. This analysis did not include economic analysis of the project's tokenomics or vesting policy. Moreover, we only audited this contract for the Plexrum team. The presale was audited in parallel and reported separately, and the two were also exercised together, since this contract's correctness depends on presale state. The PLXR token was not part of this submission, so the findings previously raised against it remain open and unverified. The sources were supplied as archives without the dependency tree or the vesting math library, so a build was reconstructed for analysis using the pinned compiler version, OpenZeppelin 5.6.1, and the vesting math library as it appeared in the previous revision; the shipping schedule implementation should be confirmed against the team's own repository. We recommend investors do their own research before investing.

Files and details

Findings and Audit result

low Issues | 3 findings

Resolved

#1 low Issue
Vesting pause is now bounded in code, but the bound can be rolled forward indefinitely because nothing enforces a gap between consecutive pauses
VestingVault.sol
L239
Description

Previously reported as an unbounded pause on a contract that holds the entire buyer pool. The remediation is the right shape and the reasoning behind it is correct: unlike the presale, which never custodies buyer funds, this vault holds tokens buyers have already paid for, so a published policy alone is not an adequate mitigation and a code bound was needed. Claims are now blocked only while paused and still within fourteen days of when the pause began, so they resume without any owner action once that window elapses. The gap is in how the window is anchored. The timestamp is rewritten on every pause and there is no minimum interval between pauses, so unpausing and re-pausing starts a brand-new fourteen-day window. Those are two separate calls, but an owner that can batch them into one transaction, which is the normal case for a multisig or a timelock executor, leaves no block in which a claim is possible. Demonstrated by test with a contract owner batching both calls: twenty consecutive windows, roughly ten months, with every claim attempt reverting at every point in time and nothing claimed. The interface documentation states the intended behaviour plainly, that re-pausing after a previous pause expired starts a brand-new window, so this is a deliberate design choice whose consequence appears not to have been followed through.

Resolved

#2 low Issue
Payable constructor trapped ether permanently in the vault because the contract has no ether exit path
VestingVault.sol
L133
Description

Previously reported. The constructor had been marked payable as a deployment gas optimization, but the vault has no receive function, no fallback and no ether rescue, so any value attached at deployment would have been frozen for the contract's lifetime.

Resolved

#3 low Issue
Single-step ownership transfer on the vesting admin
VestingVault.sol
L25
Description

Originally reported in the first engagement. A mistyped recipient in a single-step transfer would hand the vault admin over irrecoverably, with renunciation disabled so no recovery path remained.

optimization Issues | 1 findings

Pending

#1 optimization Issue
Beneficiary record occupies seven storage slots where two would hold every bounded field
IVestingVault.sol
L113
Description

New, and low priority. The beneficiary record uses five full-width integers plus an enum and a flag, so seven slots per beneficiary. Every one of those fields is already bounded well inside a narrower type by the validation the contract performs: the two token amounts are bounded by the token cap and the three time values are each bounded by the maximum vesting duration of ten years. The whole record fits in two slots. With up to two hundred advisors and two hundred team members, each add, update and claim pays for the extra slots.

informational Issues | 10 findings

Pending

#1 informational Issue
Buyer vesting schedule could not be verified against an implementation, because the vesting math library was not part of the sources received
VestingVault.sol
L11
Description

Scope limitation rather than a defect. The vault imports its entire vesting schedule from a math library: every schedule constant it exposes publicly, and both vesting curves, are re-exported from that library. That file was not present in the archive supplied for this review, so neither the buyer curve nor the beneficiary curve could be read from code in this round. The previous engagement raised the same gap alongside a documentation conflict, where the buyer vesting duration was stated as seven hundred and thirty days in four places while the only implementation then in evidence used three hundred and sixty-five.

Resolved

#2 informational Issue
Owner could permanently block all claims by never finalizing the presale
VestingVault.sol
L167
Description

Originally reported in the first engagement and re-raised in the second, where the permissionless finalization path added in response had a deadline derived from owner-mutable stage timing. Three routes defeated it, one of them permanently through an arithmetic panic, so a passive owner could still keep every claim blocked indefinitely.

Resolved

#3 informational Issue
Vault had no on-chain check that it holds enough tokens to honour all claims
VestingVault.sol
L167
Description

Originally reported in the first engagement. Nothing verified that the vault was funded, so an under-funded vault could be locked into the claim phase and late claimers would hit a revert.

Resolved

#4 informational Issue
Owner could defer the generation event indefinitely while it had not yet been reached
VestingVault.sol
L167
Description

Originally reported in the first engagement. The generation event timestamp could be re-set without limit as long as it had not yet arrived, so the owner could defer claims for as long as they liked.

Resolved

#5 informational Issue
Removed beneficiaries left stale data in their storage struct
VestingVault.sol
L672
Description

Originally reported in the first engagement. Removal cleared only some fields, leaving the rest of the beneficiary record behind.

Resolved

#6 informational Issue
Previous token ticker persisted throughout the public interface of the vault after the rename
VestingVault.sol
L13
Description

Previously reported. The old ticker survived in function names, error names, event names and documentation across the vault and its interface after the project renamed the token.

Resolved

#7 informational Issue
Advisor allocation struct was declared in the interface but never used by any function or event
IVestingVault.sol
L104
Description

Previously reported. A dedicated advisor allocation struct remained in the interface after advisors were folded into the generic beneficiary record, with nothing referencing it.

Resolved

#8 informational Issue
Custom error for a non-beneficiary caller was declared in the interface but never thrown
IVestingVault.sol
L10
Description

Originally reported in the first engagement. An error was declared and never used.

Pending

#9 informational Issue
Vault funding is permissionless while the only route back out is owner-restricted
VestingVault.sol
L483
Description

New, and a consequence of the funding helper added for the solvency fix. Anyone may fund the vault, which is deliberate and documented, and the only path back out is the surplus rescue, which is owner-only. Any third party who tops the vault up beyond outstanding obligations is therefore donating to the owner rather than to buyers, since surplus above obligations is precisely what the rescue path is allowed to withdraw. The documentation notes that anyone may fund and that the owner is the only party who can rescue surplus, so the behaviour is stated, but it is stated as two separate facts rather than as the conclusion they add up to.

Pending

#10 informational Issue
Beneficiary refunds are sent to the current owner rather than to the address the tokens were pulled from
VestingVault.sol
L315
Description

New, and minor. Adding a beneficiary or raising an allocation pulls the tokens from the caller, while lowering an allocation or removing a beneficiary refunds to whatever address is the owner at that moment. The two are the same address in normal operation, because all four functions are owner-gated. They diverge if ownership changes between an add and a later reduction, in which case the refund is paid to the new owner rather than to the party that supplied the tokens. All four operations are pre-generation-event only, so the window is bounded, and this is not exploitable by anyone other than the owner.