VegaTokenVulnerable.sol
VSS-20260924-48F09N0N · generated Sep 24, 2026, 4:42 PM
Verdict is derived from severity counts via the same deterministic formula every VegaSec report uses. VegaTokenVulnerable.sol was scanned from pasted source. This is static-analysis triage, not a certification or formal audit attestation.
PDF artifact
Queued artifact pipeline · not blocking on the scan
No PDF artifact has been requested for this report yet. The HTML report and the Markdown export already carry the full disclaimer and limitations inline. PDF synthesis is a queued artifact, not part of the scan path.
Status endpoint
GET /report/solidity/VSS-20260924-48F09N0N/export.pdf
Solidity evidence report
14 audit findings
Severity distribution
Executive summary
- 14 findings surfaced (1 critical, 3 high, 6 medium, 1 low, 3 informational).
- CRITICAL · selfdestruct call — exploitability unknown.
- HIGH · VegaTokenVulnerable.unsafeReviewerLottery(address[]) (VegaTokenVulnerable.sol#28-34) uses a weak PRNG: "picked = reviewers[block.timestamp % reviewers.length] ( (unsafeReviewerLottery) — exploitability medium.
- HIGH · Reentrancy in VegaTokenVulnerable.withdrawReviewCredit(uint256) (VegaTokenVulnerable.sol#36-42): (withdrawReviewCredit) — exploitability medium.
- Automated static analysis only. A human operator review has not been attached to this report.
Warnings (1)
- · Unmapped detector slither:immutable-states — classified as 'other'
- criticalCentralizationDetector: semgrep
selfdestruct call
Evidence
selfdestruct call. Even with access control, selfdestruct introduces upgrade risk and historical state loss. Audit access control carefully or remove.
Exploitability notes
Analyzer did not report a confidence level; treat as unverified until reviewed.
Remediation
Document the trust boundary, set up time-locked multisig ownership, and surface admin-only functions in the deployment runbook.
- highOracle manipulationConfidence: mediumExploitability: mediumDetector: slither
VegaTokenVulnerable.unsafeReviewerLottery(address[]) (VegaTokenVulnerable.sol#28-34) uses a weak PRNG: "picked = reviewers[block.timestamp % reviewers.length] (
Evidence
VegaTokenVulnerable.unsafeReviewerLottery(address[]) (VegaTokenVulnerable.sol#28-34) uses a weak PRNG: "picked = reviewers[block.timestamp % reviewers.length] (VegaTokenVulnerable.sol#31)"
Exploitability notes
Medium-confidence detection; manual review required before relying on the finding either way.
Remediation
Use multi-source price feeds (e.g. Chainlink + TWAPs) and validate freshness/deviation before consuming oracle data on-chain.
- highReentrancyConfidence: mediumExploitability: mediumDetector: slither
Reentrancy in VegaTokenVulnerable.withdrawReviewCredit(uint256) (VegaTokenVulnerable.sol#36-42):
Evidence
Reentrancy in VegaTokenVulnerable.withdrawReviewCredit(uint256) (VegaTokenVulnerable.sol#36-42): External calls: - (ok,None) = address(msg.sender).call{value: amount}() (VegaTokenVulnerable.sol#39) State variables written after the call(s): - balances[msg.sender] -= amount (VegaTokenVulnerable.sol#41) VegaTokenVulnerable.balances (VegaTokenVulnerable.sol#10) can be used in cross function reentrancies: - VegaTokenVulnerable.balances (VegaTokenVulnerable.sol#10) - VegaTokenVulnerable.constructor() (VegaTokenVulnerable.sol#15-18) - VegaTokenVulnerable.mintForReview(address,uint256) (VegaTokenVulnerable.sol#22-26) - VegaTokenVulnerable.withdrawReviewCredit(uint256) (VegaTokenVulnerable.sol#36-42)
Exploitability notes
Medium-confidence detection; manual review required before relying on the finding either way.
Remediation
Apply the checks-effects-interactions pattern. State writes must happen before external calls, and consider OpenZeppelin's ReentrancyGuard for high-risk entry points.
- highAccess controlConfidence: highExploitability: highDetector: slither
VegaTokenVulnerable.retireFixture() (VegaTokenVulnerable.sol#44-48) allows anyone to destruct the contract
Evidence
VegaTokenVulnerable.retireFixture() (VegaTokenVulnerable.sol#44-48) allows anyone to destruct the contract
Exploitability notes
High-confidence detection of a severe pattern; treat as exploitable until disproven by manual review.
Remediation
Gate privileged functions behind a tested role/ownership pattern (e.g. OpenZeppelin Ownable/AccessControl). Avoid tx.origin for authorization.
- mediumAccess controlConfidence: mediumExploitability: mediumDetector: slither
VegaTokenVulnerable.mintForReview(address,uint256) (VegaTokenVulnerable.sol#22-26) uses tx.origin for authorization: require(bool,string)(tx.origin == owner,ori
Evidence
VegaTokenVulnerable.mintForReview(address,uint256) (VegaTokenVulnerable.sol#22-26) uses tx.origin for authorization: require(bool,string)(tx.origin == owner,origin owner only) (VegaTokenVulnerable.sol#24)
Exploitability notes
Medium-confidence detection; manual review required before relying on the finding either way.
Remediation
Gate privileged functions behind a tested role/ownership pattern (e.g. OpenZeppelin Ownable/AccessControl). Avoid tx.origin for authorization.
- mediumAccess controlDetector: semgrep
Use of tx.origin for authorization
Evidence
Use of tx.origin for authorization. tx.origin can be tricked via phishing contracts. Prefer msg.sender.
Exploitability notes
Analyzer did not report a confidence level; treat as unverified until reviewed.
Remediation
Gate privileged functions behind a tested role/ownership pattern (e.g. OpenZeppelin Ownable/AccessControl). Avoid tx.origin for authorization.
- mediumTimestamp dependenceDetector: semgrep
block.timestamp used in a value computation
Evidence
block.timestamp used in a value computation. Miners can adjust block.timestamp within ~15s; do not use it for randomness or time-critical comparisons.
Exploitability notes
Analyzer did not report a confidence level; treat as unverified until reviewed.
Remediation
Treat block.timestamp as a coarse value with miner influence; prefer block-number windows for short-term invariants and add tolerance bands.
- mediumUnchecked callDetector: semgrep
Low-level .call to an externally-controlled target
Evidence
Low-level .call to an externally-controlled target. Combined with reentrancy or unchecked return values, this is a common fund-draining pattern.
Exploitability notes
Analyzer did not report a confidence level; treat as unverified until reviewed.
Remediation
Check the boolean return of low-level call/delegatecall/send and revert on failure with a descriptive reason string.
- mediumAccess controlConfidence: mediumExploitability: mediumDetector: slither
VegaTokenVulnerable.retireFixture() (VegaTokenVulnerable.sol#44-48) uses tx.origin for authorization: require(bool,string)(tx.origin == owner,origin owner only)
Evidence
VegaTokenVulnerable.retireFixture() (VegaTokenVulnerable.sol#44-48) uses tx.origin for authorization: require(bool,string)(tx.origin == owner,origin owner only) (VegaTokenVulnerable.sol#46)
Exploitability notes
Medium-confidence detection; manual review required before relying on the finding either way.
Remediation
Gate privileged functions behind a tested role/ownership pattern (e.g. OpenZeppelin Ownable/AccessControl). Avoid tx.origin for authorization.
- mediumAccess controlDetector: semgrep
Use of tx.origin for authorization
Evidence
Use of tx.origin for authorization. tx.origin can be tricked via phishing contracts. Prefer msg.sender.
Exploitability notes
Analyzer did not report a confidence level; treat as unverified until reviewed.
Remediation
Gate privileged functions behind a tested role/ownership pattern (e.g. OpenZeppelin Ownable/AccessControl). Avoid tx.origin for authorization.
- lowAccess controlConfidence: mediumExploitability: mediumDetector: slither
VegaTokenVulnerable.unsafeReviewerLottery(address[]).picked (VegaTokenVulnerable.sol#28) lacks a zero-check on :
Evidence
VegaTokenVulnerable.unsafeReviewerLottery(address[]).picked (VegaTokenVulnerable.sol#28) lacks a zero-check on : - reviewer = picked (VegaTokenVulnerable.sol#32)
Exploitability notes
Medium-confidence detection; manual review required before relying on the finding either way.
Remediation
Gate privileged functions behind a tested role/ownership pattern (e.g. OpenZeppelin Ownable/AccessControl). Avoid tx.origin for authorization.
- informationalLogicConfidence: highExploitability: lowDetector: slither
Version constraint ^0.8.20 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
Evidence
Version constraint ^0.8.20 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) - VerbatimInvalidDeduplication - FullInlinerNonExpressionSplitArgumentEvaluationOrder - MissingSideEffectsOnSelectorAccess. It is used by: - ^0.8.20 (VegaTokenVulnerable.sol#2)
Exploitability notes
Informational signal; not directly exploitable without additional context.
Remediation
Re-derive the business rule by hand, write a property-based test that fails on the current path, and only then fix the implementation.
- informationalOtherConfidence: highExploitability: lowDetector: slither
VegaTokenVulnerable.owner (VegaTokenVulnerable.sol#11) should be immutable
Evidence
VegaTokenVulnerable.owner (VegaTokenVulnerable.sol#11) should be immutable
Exploitability notes
Informational signal; not directly exploitable without additional context.
Remediation
Review the detector output against the source manually; if exploitable, design a fix and add a regression test before deploying.
- informationalUnchecked callConfidence: highExploitability: lowDetector: slither
Low level call in VegaTokenVulnerable.withdrawReviewCredit(uint256) (VegaTokenVulnerable.sol#36-42):
Evidence
Low level call in VegaTokenVulnerable.withdrawReviewCredit(uint256) (VegaTokenVulnerable.sol#36-42): - (ok,None) = address(msg.sender).call{value: amount}() (VegaTokenVulnerable.sol#39)
Exploitability notes
Informational signal; not directly exploitable without additional context.
Remediation
Check the boolean return of low-level call/delegatecall/send and revert on failure with a descriptive reason string.
Exploit reasoning
Reference-grade reasoning tied to evidence
- 025d746d5dc01028d99ab6f083342b2f9b382eca5b913ce3121b6ef8656c9c07 · centralizationcritical
Not determined
Question: Is this finding exploitable in this specific contract?
Reason: Analyzer confidence or exploitability is unknown; the narrative would overclaim without operator review.
- 9e9cc0e9cfc74f54891b411b93c7449f2e172aa1da0a998e8e7b976ae04def6b · oracle-manipulationhighConfidence: low
Conditions point at the exploit but at least one precondition needs operator confirmation.
Preconditions
- Price or rate read from an on-chain source that can be moved in the same block by the caller
- Decisions (mint amount, collateral check) derived from the manipulable price
Action
Attacker uses a flash loan or large swap to move the oracle price in the same block, triggers the price-dependent action, then reverts the price.
Impact
Mint of more shares than collateral warrants, undercollateralized borrow, or theft of liquidity by exploiting the manipulated rate.
False-positive caveats
- The oracle may be a time-weighted aggregator that resists single-block movement.
- The function may compare against a snapshot taken on a separate block.
Remediation checklist
- Use a TWAP (time-weighted average price) over multiple blocks.
- Cross-check at least two independent oracle sources before acting.
- Reject prices that diverge from a recent average by more than a documented threshold.
- e3c81b2bb05292a33bb195f5efdac2095dcb7378274eb86ee20c848b965cd13e · reentrancyhighConfidence: low
Conditions point at the exploit but at least one precondition needs operator confirmation.
Preconditions
- External call to an untrusted address before the contract's own state is updated
- Contract or callback path reachable from the external caller
- No nonReentrant guard or equivalent on the entry-point function
Action
Attacker contract receives control during the external call and re-enters the original function before the original state write completes, repeating the state-changing side effect.
Impact
Duplicated withdrawals, double-spend on accounting balances, or out-of-order updates to invariants the function relies on.
False-positive caveats
- The external call may be to a known, trusted contract whose behavior is provable.
- The function may be guarded indirectly by a flag or external lock not visible to the analyzer.
Remediation checklist
- Apply checks-effects-interactions: update internal state before any external call.
- Add a nonReentrant guard on the entry-point function.
- Where feasible, pull-payment instead of push-payment on user balances.
- 7d9b78b620334b47ab494454ec49b378daf245c24264ec5ee94fd81ae25ca8a0 · access-controlhighConfidence: high
Conditions for the exploit are met by the analyzer evidence; treat as likely until disproven by operator review.
Preconditions
- Sensitive function lacks an explicit caller restriction or relies on tx.origin
- Caller controls the path that reaches the function
Action
Attacker calls the unprotected function from an attacker-controlled address, bypassing the intended restriction.
Impact
Unauthorized state mutation: ownership transfer, parameter changes, balance writes, or admin-only operations executed by a non-admin.
False-positive caveats
- The function may be intentionally callable by anyone (e.g. a public mint with a price guard).
- Access control may live in a modifier the analyzer did not parse.
Remediation checklist
- Replace tx.origin checks with msg.sender against a role registry.
- Add a `onlyRole(...)` or equivalent modifier from a vetted access control library.
- Add unit tests that assert non-admin callers revert.
- 8d94c22f92bfff04d2cec20f538c96db7e75d788478a91bc7ffd1cceea98d7a0 · access-controlmediumConfidence: low
Conditions point at the exploit but at least one precondition needs operator confirmation.
Preconditions
- Sensitive function lacks an explicit caller restriction or relies on tx.origin
- Caller controls the path that reaches the function
Action
Attacker calls the unprotected function from an attacker-controlled address, bypassing the intended restriction.
Impact
Unauthorized state mutation: ownership transfer, parameter changes, balance writes, or admin-only operations executed by a non-admin.
False-positive caveats
- The function may be intentionally callable by anyone (e.g. a public mint with a price guard).
- Access control may live in a modifier the analyzer did not parse.
Remediation checklist
- Replace tx.origin checks with msg.sender against a role registry.
- Add a `onlyRole(...)` or equivalent modifier from a vetted access control library.
- Add unit tests that assert non-admin callers revert.
- d3a46569a601f7bdcf08c52c1ce6a464f24ea0d6035d39fa18437b6c940bbc00 · access-controlmedium
Not determined
Question: Is this finding exploitable in this specific contract?
Reason: Analyzer confidence or exploitability is unknown; the narrative would overclaim without operator review.
- 4bf225cdc0c238c3ce62538e80d89916562e5eb0b7ed3c988eaf7bb73b29c755 · timestamp-dependencemedium
Not determined
Question: Is this finding exploitable in this specific contract?
Reason: Analyzer confidence or exploitability is unknown; the narrative would overclaim without operator review.
- 24612734790f3f6ca717a5032967841c609ae6046549b32eb41f771d29f905a2 · unchecked-callmedium
Not determined
Question: Is this finding exploitable in this specific contract?
Reason: Analyzer confidence or exploitability is unknown; the narrative would overclaim without operator review.
- b85d4c6b14a005cc536ebad1f32253f03512ff61c8e9c49a7cbf0952e914f482 · access-controlmediumConfidence: low
Conditions point at the exploit but at least one precondition needs operator confirmation.
Preconditions
- Sensitive function lacks an explicit caller restriction or relies on tx.origin
- Caller controls the path that reaches the function
Action
Attacker calls the unprotected function from an attacker-controlled address, bypassing the intended restriction.
Impact
Unauthorized state mutation: ownership transfer, parameter changes, balance writes, or admin-only operations executed by a non-admin.
False-positive caveats
- The function may be intentionally callable by anyone (e.g. a public mint with a price guard).
- Access control may live in a modifier the analyzer did not parse.
Remediation checklist
- Replace tx.origin checks with msg.sender against a role registry.
- Add a `onlyRole(...)` or equivalent modifier from a vetted access control library.
- Add unit tests that assert non-admin callers revert.
- 2b383bb32009d69610ac628adccd9eee4b96f1e5449289991c5149e18497756b · access-controlmedium
Not determined
Question: Is this finding exploitable in this specific contract?
Reason: Analyzer confidence or exploitability is unknown; the narrative would overclaim without operator review.
Audit pipeline
Audit cockpit
Honest stage-by-stage view of what VegaSec ran against this contract. Automated stages do not replace a human operator review.
Audit intake
Passed320ms replay4:42 PMNormalize the submitted contract target and confirm it can enter the Solidity audit lane.
Source acquisition
Passed1.4s replay4:42 PMResolve pasted source or verified explorer source without treating malformed input as demo data.
Toolchain validation
Partial2.3s replay4:42 PMConfirm the configured static analyzers can run and produce parseable output.
- One or more analyzers emitted warnings; report findings remain usable but should be read with limitations.
Static analysis
Partial14 findings8.8s replay4:42 PMRun static analyzers against the sandboxed source and collect raw detector evidence.
- One or more analyzers emitted warnings; report findings remain usable but should be read with limitations.
Finding normalization
Passed14 findings1.1s replay4:42 PMDedupe detectors, classify vulnerability classes and compute severity-weighted risk.
Exploitability review
Partial14 findings1.9s replay4:42 PMFrame automated findings with conservative exploitability and limitation notes.
- Automated exploitability review is conservative and does not replace a manual exploitability assessment.
Remediation draft
Partial14 findings1.5s replay4:42 PMPrepare remediation-oriented evidence for the shareable report artifact.
- Remediation notes are generated from detector evidence and require project-specific engineering review.
Operator review
Blocked0ms replay4:42 PMRecord whether a human operator artifact exists before buyer escalation.
- No operator review artifact is attached to this automated scan.
- Human operator review has not been attached to this automated scan yet.
Finalization
Partial14 findings620ms replay4:42 PMPublish the automated report artifact or explain why the scan failed closed.
Artifact: Automated Solidity report · solidity-2f746d702f766567
- Final report is an automated static-analysis artifact; no operator review artifact is attached.
How to read this report
Score, confidence, ranking: four moving parts, no hand-tuning.
Generated Sep 24, 2026, 4:42 PM · Solidity · VegaTokenVulnerable.sol
Score bands
0-19
AVOID-style triage · this report
Multiple high or critical findings, low source confidence, or unverified context. Public action should pause until a Private Review or a re-scan with better evidence.
20-49
High caution
Notable findings or thin evidence. Worth a Private Review before relying on the artifact.
50-69
Watch
Mixed signals: some evidence, some gaps. Re-scan after material changes to the target.
70-89
Clear surface (automated)
No critical or high findings via static analysis. Not a safety claim: human review is still recommended for diligence work.
90-100
Strong surface (automated)
No critical or high findings, verified source, and high source confidence. Not a safety claim: human review is still recommended for diligence work.
- Score
- Deterministic 0-100 derived from severity counts. Same formula across every report. Lower means more risk.
- Confidence
- Separate axis. Measures how much VegaSec trusts the input data. Low confidence pushes the verdict toward UNKNOWN; the two are never collapsed into one number.
- Ranking / percentile
- Only meaningful within the eligible Trust Index set. Shown on /trust-index when the eligible pool is large enough. Today the public index is a controlled preview.
Private Review is separate
A paid Private Review does not raise the public score on this report. Public score reflects public-source evidence only. Private Review adds operator attestation and a confidential memo, never a score bump.