Epoch Island security record

Arbitrum, Base, Ethereum, Optimismepochisland.ioX

As of 3 Nov 2026, Epoch Island has 2 audit reports by 1 security firm on Trustblock; the latest is by Quantstamp, dated 7 Nov 2023. Those reports list no open critical findings.

Critical findings
No open critical findings
Across 2 reports.
Open the latest report
Your label, live
Get the label for your site

Record last updated . It holds audits, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.

Audits2

Newest first

AuditSecurity firmDateScopeCritical findingsReport
Epoch Island - LP PoolSecurity firm: QuantstampDate: Scope: Files named in the reportNo open critical findingsOpen · certificate.quantstamp.com
Epoch Island - vEPOCH TokenSecurity firm: QuantstampDate: Scope: Files named in the reportNo open critical findingsOpen · certificate.quantstamp.com

Findings32

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

SeverityOpenAcknowledgedFixed
Critical000
High001
Medium023
Low4166
HighCalling `withdrawForfeit()` Multiple Times for a Single Deposit Would Cause Loss of FundsEpoch Island - vEPOCH Token · Quantstamp · 3 Nov 2023Fixed

When calling `withdrawForfeit()`, the rewards that need to be paid back to the contract is calculated as follows: ``` uint256 forfeitReward = ((earned[_depositId] + rewardTokensClaimed[_depositId]) * percentage) / 1e18; ``` However, the `rewardTokensClaimed` is never updated after the payback. Thus, when users don't withdraw 100 percent of their deposit, they will repay more rewards than they are obligated to with the following withdrawals. Furthermore, the user won't be able to unlock the entire deposit unless they buy `rewardToken` to pay back.

Open the report
MediumLack of Economic Incentive for TakerEpoch Island - LP Pool · Quantstamp · 7 Nov 2023Fixed

The taker has no economic incentive to act upon desired positions immediately. The reason is that the protocol and LP decrease towards the position end. As a result, the conditions for the positions become better for the taker over time. If a taker acts ideally in terms of game theory, they would wait with the trade as long as possible. Therefore, their ideal strategy would be to observe the mempool until they see a transaction that would prevent their transaction and front-run it. A transaction prevents the takers transaction if it reduces the available `downsideToken` amount below the desired amount.

Open the report
MediumPossible Reentrancy AttacksEpoch Island - LP Pool · Quantstamp · 7 Nov 2023Fixed

The following functions are violating the "Checks-Effects-Interactions"-pattern and/or do not employ any reentrancy mitigating modifers, making them susceptible to reentrancy: 1. `EpochUpsidePoolV1.supply()`. 1. `EpochUpsidePoolV1.remove()`. 1. `EpochUpsidePoolV1.take()`. 1. `EpochUpsidePoolV1.untake()`. 1. `EpochUpsidePoolV1.claimProtocolFees()`. 1. `EpochUpsidePoolV1.claimPositionFees()`.

Open the report
MediumAttacker May Reduce Other User RewardsEpoch Island - vEPOCH Token · Quantstamp · 3 Nov 2023Fixed

An attacker may be able to reduce the rewards received by other users without any penalty, only incurring gas costs. Such an attack is possible whenever `forfeitRedirectionAddress != address(0)`. The described exploit scenario will lead to the fact that current deposits will receive fewer reward shares. In case the attacker has control over `forfeitRedirectionAddress`, they will be able to claim those rewards without any deposits being locked.

Open the report
LowInconsistency in Token Amount Calculations for Large Input Amounts Relative to LiquidityEpoch Island - LP Pool · Quantstamp · 7 Nov 2023Fixed

In the revised `take()` function, there is an issue concerning the calculation of token amounts when the provided `_maxDownsideTokenIn` is larger than the available liquidity. This situation triggers a reverse calculation to adjust the amount of downside tokens after fees (`_downsideTokenBalanceAfterFees`). However, the current implementation may lead to a scenario where the sum of `_downsideTokenBalanceAfterFees`, `protocolFee`, and `lpFee` does not equal the initial `_maxDownsideTokenIn`. This discrepancy can result in users unintentionally committing a higher amount of downside tokens than intended, especially when liquidity is low, leading to unexpected financial implications.

Open the report
LowInefficient gas usageEpoch Island - LP Pool · Quantstamp · 7 Nov 2023Fixed

We could identify an incident of inefficient gas usage: `lpPositions` is a mapping, although it is treated like an array. It is more expensive to store new values in a mapping as opposed to an array.

Open the report
LowUnlocked PragmaEpoch Island - LP Pool · Quantstamp · 7 Nov 2023Fixed

Every Solidity file specifies in the header a version number of the format `pragma solidity (^)0.8.*`. The caret (`^`) before the version number implies an unlocked pragma, meaning that the compiler will use the specified version _and above_, hence the term "unlocked".

Open the report
LowUse of unsafe ERC20 transfer functions and not checking return valuesEpoch Island - LP Pool · Quantstamp · 7 Nov 2023Fixed

The following lines are using the 'unsafe' ERC20 interface functions (`transfer()`): 1. `EpochUpsidePoolV1.sol#L87`. 1. `EpochUpsidePoolV1.sol#L91`. 1. `EpochUpsidePoolV1.sol#L136`. 1. `EpochUpsidePoolV1.sol#L156`. 1. `EpochUpsidePoolV1.sol#L180`. 1. `EpochUpsidePoolV1.sol#L191`. Further, their return values were not checked, which, depending on token, could lead to failed transactions but continued code execution, incorrect accounting within the `EpochUpsidePoolV1.sol` contract and ultimately to loss of funds for the protocol/participants. Since [some ERC20 tokens do not return a value on above mentioned functions/behave non-uniformly](https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca) it is advised to use a secure wrapping interface around said functions, like for example OpenZeppelins [SafeERC20](https://docs.openzeppelin.com/contracts/2.x/api/token/erc20#SafeERC20), which implicitly checks for the different error cases.

Open the report
LowChecks-Effects-Interactions Pattern ViolationEpoch Island - vEPOCH Token · Quantstamp · 3 Nov 2023Fixed

The [Checks-Effects-Interactions](https://solidity.readthedocs.io/en/latest/security-considerations.html#use-the-checks-effects-interactions-pattern) coding pattern is meant to mitigate any chance of other contracts manipulating the state of the blockchain in unexpected and possibly malicious ways before control is returned to the original contract. As the name implied, only after checking whether appropriate conditions are met and acting internally on those conditions should any external calls to, or interactions with, other contracts be done. The following functions are violating the "Checks-Effects-Interactions"-pattern and/or do not employ any reentrancy mitigating modifers, making them susceptible to reentrancy: 1. `Vepoch.addRewardTokens()`. 1. `Vepoch.claimYield()`. 1. `Vepoch.deposit()`. 1. `Vepoch.withdrawForfeit()`. 1. `Vepoch.withdraw()`.

Open the report
LowUnlocked PragmaEpoch Island - vEPOCH Token · Quantstamp · 3 Nov 2023Fixed

Every Solidity file specifies in the header a version number of the format `pragma solidity (^)0.8.*`. The caret (`^`) before the version number implies an unlocked pragma, meaning that the compiler will use the specified version _and above_, hence the term "unlocked".

Open the report

Contracts

No deployed address is recorded for these audits.

The reports name a repository or files. Open a report to see its scope.

The repositories and files the reports name

Show this on your site

Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.

Content

Facts

Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.

Fixed as
Language

Style

Layout
Theme
Accent
Corners

Format

Size
Date
Embed as
HTML
<head>
<script src="https://widget.trustblock.run/project-widget.min.js" defer></script>
</head>
<body>
<div
data-tb-project-widget
data-tb-project-slug="epoch-island"
></div>
</body>

Paste the code where the label should appear. It uses no API credit and updates by itself.

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