# Bonus-Issue EPS Restatement

`D46-F01-A06` · Earnings and Per-Share Analytics → Earnings and Share Foundations · archetype `record-transform` · difficulty 2/5 · verification **verified**

Full page: https://docs.thefintechbuilder.com/earnings-and-per-share-analytics/earnings-and-share-foundations/bonus-issue-eps-restatement/
Agent skill: `npx skills add IslamBaraka90/Fintech-Algorithms-Library` — https://docs.thefintechbuilder.com/guides/agent-skill/

## Install and import

```bash
npm install fintech-algorithms
```

```ts
import { bonusIssueEpsRestatement } from "fintech-algorithms/earnings-and-per-share-analytics/earnings-and-share-foundations/bonus-issue-eps-restatement";
```

## Signature

```ts
bonusIssueEpsRestatement(input)
```

Restates weighted-average ordinary shares and basic EPS for bonus issues, multiplying each period by the `(existing + bonus) / existing` factor of every event effective after that period's basis date. All arithmetic runs in 50-significant-digit decimal with half-even rounding and the money figures come back as exact decimal strings. A contract failure is rethrown as an `Error` whose message begins `EPS calculation failed: `.

## Parameters

| Name | Type | Required | Notes |
| --- | --- | --- | --- |
| `input` | `{ events: Array<{ event_id, effective_date, existing_shares, bonus_shares, no_additional_consideration, event_is_effective }>, periods: Array<{ period_id, basis_date, basis_is_uniform, earnings_available_to_ordinary_shareholders, weighted_average_ordinary_shares, is_final }> }` | yes | `events` and `periods` are both required and must be non-empty arrays. Each event needs a unique truthy `event_id`, an `effective_date` in `YYYY-MM-DD` form that is strictly later than the previous event's, `existing_shares` and `bonus_shares` as positive integer strings, and both `no_additional_consideration` and `event_is_effective` set to `true`. Each period needs a `basis_date`, `basis_is_uniform` set to `true`, and canonical decimal strings for `earnings_available_to_ordinary_shareholders` and `weighted_average_ordinary_shares`, the latter strictly positive. `is_final` is optional and defaults to `false`. There are no numeric tuning parameters and nothing else is defaulted. |

## Returns

`{ topic_id, state, periods, all_final }`

`state` is always `calculated`. `periods` follows the input order and each row carries `period_id`, `applied_event_ids`, `factor_numerator`, `factor_denominator`, `earnings`, `pre_restatement_shares`, `restated_shares`, `pre_restatement_basic_eps`, `restated_basic_eps` and `is_final`. The factor is an exact reduced fraction reported as two integer strings, and every share and EPS figure is a decimal string. `all_final` is `true` only when every period row is final.

## Errors

- When `existing_shares` or `bonus_shares` is not a positive integer string, for instance an `existing_shares` of `0` — throws Error
- When an `event_id` repeats or the `effective_date` values are not strictly increasing, an event is not marked effective and free of additional consideration, a date is not a real `YYYY-MM-DD` value, `weighted_average_ordinary_shares` is not positive, or `basis_is_uniform` is not `true` — throws Error

## Complexity

Time `O(e * p) for e events and p periods`, space `O(e + p)`.

## Worked example

Captured by running this function on the input its own test provides. Real output of real code — but not asserted against a published figure.

### Input

`input`:

```json
{
  "events": [
    {
      "event_id": "SYN-BONUS-1",
      "effective_date": "2025-03-15",
      "bonus_shares": "1",
      "existing_shares": "4",
      "no_additional_consideration": true,
      "event_is_effective": true
    },
    {
      "event_id": "SYN-BONUS-2",
      "effective_date": "2025-09-01",
      "bonus_shares": "1",
      "existing_shares": "10",
      "no_additional_consideration": true,
      "event_is_effective": true
    }
  ],
  "periods": [
    {
      "period_id": "SYN-2024",
      "period_start": "2024-01-01",
      "period_end": "2024-12-31",
      "basis_date": "2024-12-31",
      "basis_is_uniform": true,
      "earnings_available_to_ordinary_shareholders": "24000000",
      "weighted_average_ordinary_shares": "10000000",
      "is_final": true
    },
    {
      "period_id": "SYN-2025-Q3",
      "period_start": "2025-01-01",
      "period_end": "2025-09-30",
      "basis_date": "2025-03-15",
      "basis_is_uniform": true,
      "earnings_available_to_ordinary_shareholders": "-3300000",
      "weighted_average_ordinary_shares": "12500000",
      "is_final": false
    }
  ]
}
```

### Call

```ts
bonusIssueEpsRestatement(input)
```

### Returns

object with 4 fields: topic_id, state, periods, all_final

```json
{
  "topic_id": "D46-F01-A06",
  "state": "calculated",
  "periods": [
    {
      "period_id": "SYN-2024",
      "applied_event_ids": ["SYN-BONUS-1", "SYN-BONUS-2"],
      "factor_numerator": "11",
      "factor_denominator": "8",
      "earnings": "24000000",
      "pre_restatement_shares": "10000000",
      "restated_shares": "13750000",
      "pre_restatement_basic_eps": "2.4",
      "restated_basic_eps": "1.7454545454545454545454545454545454545454545454545",
      "is_final": true
    },
    {
      "period_id": "SYN-2025-Q3",
      "applied_event_ids": ["SYN-BONUS-2"],
      "factor_numerator": "11",
      "factor_denominator": "10",
      "earnings": "-3300000",
      "pre_restatement_shares": "12500000",
      "restated_shares": "13750000",
      "pre_restatement_basic_eps": "-0.264",
      "restated_basic_eps": "-0.24",
      "is_final": false
    }
  ],
  "all_final": false
}
```

## Verification and provenance

Tier: **verified** (via E).

The worked example below is the figure published in this algorithm's article, replayed and asserted by the test suite on every build. The arithmetic cannot drift without the build failing.

Both tiers guarantee the signature. Full explanation: https://docs.thefintechbuilder.com/guides/verification/

Generated from the docs.json payload shipped inside fintech-algorithms@0.13.0.
The signature and parameter list are checked against the compiled implementation at build time,
so a description that contradicts the code fails the build rather than reaching this file.

## Links

- Article (how it works, step by step): https://thefintechbuilder.com/earnings-and-per-share-analytics/earnings-and-share-foundations/bonus-issue-eps-restatement/
- Implementation source: https://github.com/IslamBaraka90/Fintech-Algorithms-Library/blob/main/src/earnings-and-per-share-analytics/earnings-and-share-foundations/bonus-issue-eps-restatement/impl.ts
- Package on npm: https://www.npmjs.com/package/fintech-algorithms
- Domain index for agents: https://docs.thefintechbuilder.com/earnings-and-per-share-analytics/llms.txt
